【发布时间】:2012-02-04 20:33:49
【问题描述】:
我编写了这个使用三种类型的测试代码:struct One 是没有虚成员的普通类型,struct Two : One 有一个纯虚函数和一个虚析构函数,struct Three : Two 实现了Two 的界面。
#include <iostream>
struct One
{
~One() {
std::cout << "~One()\n";
}
};
struct Two : One
{
virtual ~Two() {
std::cout << "~Two()\n";
}
virtual void test() = 0;
};
struct Three : Two
{
virtual ~Three() {
std::cout << "~Three()\n";
}
virtual void test() {
std::cout << "Three::test()\n";
}
};
int main()
{
Two* two = new Three;
two->test();
One* one = two;
delete one;
}
不出所料,the output was 这个:
三::test()
〜一个()
除了将每个析构函数设为虚拟之外,还有其他方法可以解决此问题吗?还是程序员应该小心不要遇到这种情况?我觉得编译时没有警告很奇怪。
【问题讨论】:
-
一个简单的解决方法:使用来自
One的私有或受保护继承,并通过使用声明公开功能。
标签: c++ inheritance virtual-destructor