c/c++语言开发共享31.C++-虚函数之构造函数与析构函数分析

1.构造函数不能为虚函数 当我们将构造函数定义为虚函数时,会直接报错: 首先回忆下以前学的virtual虚函数概念: 如果类定义了虚函数,创建对象时,则会分配内存空间,并且为该父类以及其所有子类的内存空间上额外分配一个虚函数表. 虚函数表的作用在于,存储每个类的相同的虚函数名,然后每一次虚函数调用, …

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

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

 31.C++-虚函数之构造函数与析构函数分析

 

首先回忆下以前学的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;  }

打印如下:

 31.C++-虚函数之构造函数与析构函数分析

 

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/c-cdevelopment/604506.html

(0)
上一篇 2021年5月12日
下一篇 2021年5月12日

精彩推荐