这个问题听起来可能太愚蠢了,但是,我在其他地方找不到具体的答案。
对后期绑定如何工作以及继承中使用的 virtual 关键字知之甚少。
如代码示例中所示,在继承的情况下,当使用指向在堆上创建的派生类对象的基类指针和删除运算符来释放内存时,将仅按顺序调用派生类和基类的析构函数当基析构函数被声明为虚函数时。
现在我的问题是:
1)当base的析构函数不是virtual时,为什么只有在使用“delete”运算符的情况下才会出现未调用派生dtor的问题,为什么在下面给出的情况下不会出现:
derived drvd;
base *bPtr;
bPtr = &drvd; //DTOR called in proper order when goes out of scope.
2)当使用“删除”运算符时,谁负责调用类的析构函数?删除运算符将有一个调用 DTOR 的实现?或者编译器写了一些额外的东西?如果操作员有实现,那么它看起来怎么样,[我需要示例代码如何实现]。
3)如果本例中使用了virtual关键字,那么operator delete现在如何知道要调用哪个DTOR?
从根本上来说,我想知道当使用删除时谁调用了类的故事。
<h1> Sample Code </h1>
class base
{
public:
base(){
cout<<"Base CTOR called"<<endl;
}
virtual ~base(){
cout<<"Base DTOR called"<<endl;
}
};
class derived:public base
{
public:
derived(){
cout<<"Derived CTOR called"<<endl;
}
~derived(){
cout<<"Derived DTOR called"<<endl;
}
};
我不确定这是不是重复的,我在搜索中找不到。
int main()
{
基 *bPtr = 新派生();
delete bPtr;// only when you explicitly try to delete an object
return 0;