我编写了使用三种类型的测试代码: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;
}
不出所料,输出是 http://ideone.com/kj4Us this:
三::测试()
〜一()
除了使每个析构函数都是虚拟的之外,还有什么方法可以解决这个问题吗?或者程序员应该小心不要遇到这种情况吗?我觉得奇怪的是编译时没有任何警告。
唯一的“修复”是不通过指向的指针删除对象One
.
这是否是一个常见问题,取决于您的类的使用方式。例如,标准库包含类似的结构unary_function
没有虚拟析构函数,但我们很少看到它像这样被滥用。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)