【发布时间】:2016-08-14 03:14:33
【问题描述】:
class Base{};
class D1:virtual public Base{};
class D2:virtual public Base{};
class DD:public D1,public D2{};
int main(){
Base *pBase=new DD;
delete pBase;
}
这会导致崩溃,但我修改如下:
class Base{
public:
virtual ~Base(){};
};
class D1:virtual public Base{
public:
virtual ~D1(){}
};
class D2:virtual public Base{
public:
virtual ~D2(){}
};
class DD:public D1,public D2{
};
然后,它通过了,但是默认的析构函数应该是虚拟的哑函数,不是吗?
【问题讨论】:
-
请不要使用 Microsoft
_tmain发布代码,除非它是 Visual C++ 特定的代码。它使其他人更难尝试您的代码,并教新手不良习惯。为你解决了这个问题。只需使用标准的int main()。 -
virtual在声明中做了什么:class D : virtual public Base?我从未见过这种结构(这可能是我的无知......)。 -
@Chiel en.wikipedia.org/wiki/Virtual_inheritance,当你继承多个共享同一个基类的类时使用它。
-
隐式声明的析构函数不是虚拟的。
-
尽管如此,您的代码在
clang和g++中都可以正常编译,并且在这里也不会崩溃。
标签: c++ destructor delete-operator virtual-inheritance virtual-destructor