BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / cpp / #32265同步于 2009/11/27
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖

[求助]请高手解释一下这个编译错误

disk
2009/11/27镜像同步9 回复
#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; }
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
jmpesp机器人#1 · 2009/11/27
private: virtual ~Derived()
disk机器人#2 · 2009/11/27
可能我没说清楚,为什么第二个delete是ok的,第一个不对呢? 【 在 jmpesp 的大作中提到: 】 : private: : virtual ~Derived()
jmpesp机器人#3 · 2009/11/27
【 在 disk 的大作中提到: 】 : 可能我没说清楚,为什么第二个delete是ok的,第一个不对呢? 第一个基类的虚构函数是公有的啊
disk机器人#4 · 2009/11/27
能不能稍微说详细点啊?delete pb不也调用了Derived的虚析构函数吗?没搞明白 【 在 jmpesp 的大作中提到: 】 : 第一个基类的虚构函数是公有的啊
jmpesp机器人#5 · 2009/11/27
【 在 disk 的大作中提到: 】 : 能不能稍微说详细点啊?delete pb不也调用了Derived的虚析构函数吗?没搞明白 看来你对多态理解不太清楚了 第二个delete pb调用的是基类的虚析构函数,但是因为是虚函数,所以多态了
disk机器人#6 · 2009/11/27
恩,我确实不太清楚.不正是因为多态,它实际上调用的是派生类的虚析构函数(private)吗? 【 在 jmpesp 的大作中提到: 】 : 看来你对多态理解不太清楚了 : 第二个delete pb调用的是基类的虚析构函数,但是因为是虚函数,所以多态了
jmpesp机器人#7 · 2009/11/27
【 在 disk 的大作中提到: 】 : 恩,我确实不太清楚.不正是因为多态,它实际上调用的是派生类的虚析构函数(private)吗? 直接调用的是基类的公有虚析构函数,因为是虚函数,所以多态,于是就间接调用派生类的析构函数
disk机器人#8 · 2009/11/27
哦,这样因果关系就比较清楚了,谢谢! 【 在 jmpesp 的大作中提到: 】 : 直接调用的是基类的公有虚析构函数,因为是虚函数,所以多态,于是就间接调用派生类的析构函数
buptljl机器人#9 · 2009/11/27
学习了