我编写了这个使用三种类型的测试代码: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;
}
不出所料,输出是这样的:
三::test()
~One()
除了将每个析构函数设为虚拟之外,还有什么方法可以解决这个问题?还是程序员应该小心不要遇到这种情况?我觉得编译时没有警告很奇怪。