返回信息流#include <iostream>
using namespace std;
class Base
{
public:
virtual ~Base()
{
cout << "Base dtor!" << endl;
}
};
class Derived : public Base
{
private:
virtual ~Derived()
{
cout << "Derived dtor!" << endl;
}
};
int main()
{
Derived* pd=new Derived;
//delete pd; //error
Base* pb=new Derived;
delete pb; //ok
return 0;
}
这是一条镜像帖。来源:北邮人论坛 / cpp / #32265同步于 2009/11/27
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖
[求助]请高手解释一下这个编译错误
disk
2009/11/27镜像同步9 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
可能我没说清楚,为什么第二个delete是ok的,第一个不对呢?
【 在 jmpesp 的大作中提到: 】
: private:
: virtual ~Derived()
能不能稍微说详细点啊?delete pb不也调用了Derived的虚析构函数吗?没搞明白
【 在 jmpesp 的大作中提到: 】
: 第一个基类的虚构函数是公有的啊
【 在 disk 的大作中提到: 】
: 能不能稍微说详细点啊?delete pb不也调用了Derived的虚析构函数吗?没搞明白
看来你对多态理解不太清楚了
第二个delete pb调用的是基类的虚析构函数,但是因为是虚函数,所以多态了
恩,我确实不太清楚.不正是因为多态,它实际上调用的是派生类的虚析构函数(private)吗?
【 在 jmpesp 的大作中提到: 】
: 看来你对多态理解不太清楚了
: 第二个delete pb调用的是基类的虚析构函数,但是因为是虚函数,所以多态了
【 在 disk 的大作中提到: 】
: 恩,我确实不太清楚.不正是因为多态,它实际上调用的是派生类的虚析构函数(private)吗?
直接调用的是基类的公有虚析构函数,因为是虚函数,所以多态,于是就间接调用派生类的析构函数
哦,这样因果关系就比较清楚了,谢谢!
【 在 jmpesp 的大作中提到: 】
: 直接调用的是基类的公有虚析构函数,因为是虚函数,所以多态,于是就间接调用派生类的析构函数