绝不在构造和析构函数中调用virtual函数

devried class对象内的base class成分会在derived class自身成分被构造之前先构造妥当。
由于base class构造函数的执行更早于dervied class构造函数,当base class构造函数执行时dervied class的成员变量尚未初始化。如果此期间调用的
virtual函数下降至dervied class阶层,要知道dervied class的函数几乎必然取用local成员变量,而那些成员变量尚未初始化。
确定你的构造函数和析构函数都没有(在对象创建和销毁期间)调用virtual函数,而它们调用的所有函数都服从统一约束。

#include
using namespace std;

class Parent{
public:
Parent(){cout<<“Parent construct”<<endl;}
virtual ~Parent(){cout<<“Parent distruct”<<endl;}
};
class Son: public Parent{
public:
Son(){cout<<“Son construct”<<endl;}
~Son(){cout<<“Son disstruct”<<endl;}
};

int main()
{
Parent *p = new Son();
delete p;
cout << “Hello World”;
return 0;
}

输出:
Parent construct
Son construct
Son disstruct //如果父类的虚构函数是non-virtual,则不会有此输出,因为子类的析构函数不会被调用
Parent distruct
Hello World

构造函数的执行顺序:父类–>子类;
析构函数的执行顺序:子类–>父类。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值