构造函数析构函数是否为虚函数

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/yanerhao/article/details/78290388

1 构造函数不能为虚函数,原因主要如下

虚函数的调用需要虚函数表指针,而该指针存放在对象的内容空间中。内存空间需要构造函数完成初始化;若构造函数声明为虚函数,那么由于对象还未创建,还没有内存空间,更没有虚函数表地址用来调用虚函数——构造函数了。

2 析构函数可以为虚函数

首先析构函数可以为虚函数,而且当要使用基类指针或引用调用子类时,最好将基类的析构函数声明为虚函数,否则可以存在内存泄露的问题。
    举例说明:
    子类B继承自基类A;A *p = new B; delete p;
    1) 此时,如果类A的析构函数不是虚函数,那么delete p;将会仅仅调用A的析构函数,只释放了B对象中的A部分,而派生出的新的部分未释放掉。
    2) 如果类A的析构函数是虚函数,delete p; 将会先调用B的析构函数,再调用A的析构函数,释放B对象的所有空间。

猜你喜欢

转载自blog.csdn.net/yanerhao/article/details/78290388