zoukankan      html  css  js  c++  java
  • 31.C++-虚函数之构造函数与析构函数分析

    1.构造函数不能为虚函数

    当我们将构造函数定义为虚函数时,会直接报错:

     

    首先回忆下以前学的virtual虚函数概念:

    • 如果类定义了虚函数,创建对象时,则会分配内存空间,并且为该父类以及其所有子类的内存空间上额外分配一个虚函数表.
    • 虚函数表的作用在于,存储每个类的相同的虚函数名,然后每一次虚函数调用,都会去虚函数表查找地址

    分析:

    假如构造函数是虚函数的话,由于对象开始还未分配内存空间,所以根本就无法找到虚函数表,从而构造函数也无法被调用.所以构造函数是不能成为虚函数.

     

    2. 析构函数可以为虚函数

    首先回忆下析构函数:

    当某个内对象被注销时,编译器会自动顺序调用该类以及其父类的析构函数,而不会调用派生类的析构函数.

    虚析构函数的好处

    假如我们通过派生类生成基类对象时,如果析构函数是虚函数,则我们释放其基类对象时,能使整个类(包括派生类)对象完全释放,如果析构函数只是普通函数,则不能析构完全.

     

    分析:

    所以当我们在用多态的时候(通过基类来调用派生类成员函数),析构函数最好为虚函数

     

    示例如下:

    #include <iostream>
    using namespace std;
    
    class ClassBase
    {
    public:
      ClassBase(){};
      virtual ~ClassBase()
      {
         cout<<"~ClassBase()"<<endl;
      }
    
      virtual void func()                         //虚函数成员
      {
          cout<<"ClassBase: func()"<<endl;
      }
    };
    
    class ClassDerived : public ClassBase
    {
    public:
      ClassDerived(){};
      ~ClassDerived()
      {
          cout<<"~ClassDerived()"<<endl;
      }
      void func()                    //虚函数成员
      {
          cout<<"ClassDerived: func()"<<endl;
      }
    };
    
     int main()
    {
       ClassBase *p = new  ClassDerived;
    
       p->func();                   //通过多态来调用派生类虚函数
    
       delete p;
    
       return 0;
    }

    打印如下:

     

  • 相关阅读:
    LaTeX公式编辑器
    早期和东京,京都大学高考试题
    猎犬追狐狸试题
    矩阵方程的计算求解(Matlab实现)
    高考压轴题
    何天成:从高联到IMO金牌,超详细数学竞赛学习方法
    几个精彩的数论问题
    高考试题网站
    泛函分析有什么好的教材?
    ifndef系列
  • 原文地址:https://www.cnblogs.com/lifexy/p/10629539.html
Copyright © 2011-2022 走看看