c++子类析构函数未调用

为什么父类的析构函数定义成virtual后,deletepTest2就会释放Derived的资源,否则就只能释放Base的资源,而deletepTest1就能释放Derived和Base的资源
classBase
{
public:
~Base(){
cout<<"Basedestructor!"<};
};
classDerived:publicBase
{
public:
~Derived(){
cout<<"Deriveddestructor!"<};
};
intmain(){
Derived*pTest1=newDerived();
Base*pTest2=newDerived();
deletepTest1;
deletepTest2;
return0;
}
慕尼黑的夜晚无繁华
浏览 898回答 2
2回答

GCT1015

以下只是个人理解,如有谬误请指出,谢谢。首先需要明确两个概念:第一个是virtual的意义,当我们通过指针调用一个类对象的方法时,编译器只有指针类型和指向地址这两个信息,它只能根据指针类型来推断指向的对象实例在内存里实际长什么样,当我们调用的是一个non-virtual方法时,C++只能根据指针类型来判断应该调用的方法,如果这个指针是一个基类指针,即使它指向的是一个子类对象,但编译器不知道啊,所以它只会调用基类中的对应方法。只有声明了virtual,C++才会在对象实例中创建一个virtualtable,里面包含了这个类对象实际持有的所有virtual函数的地址,此时我们通过一个基类指针指向子类对象,调用virtual方法,C++会到这个虚函数表中调用对应位置的函数指针,自然就能正确调用子类的方法了。第二个是析构函数的运作方式,当我们调用一个class的析构函数,从这个class起,依次往上,每个baseclass的析构函数都会逐个被调用。这也是为什么delete子类指针,子类和父类的析构函数都会被正确调用的原因。显然,当一个derivedclass对象,经由一个baseclass指针删除时,如果这个baseclass的析构函数是non-virtual的,C++就会直接调用baseclass的析构函数,derivedclass的析构函数自然得不到执行,当这个baseclass的析构函数是virtual的,C++在vtbl中找到这个对象实例所持有析构函数的函数指针,并调用它,然后根据析构函数的基本运作方式,子类先调用,基类后调用。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript