【发布时间】:2018-06-12 09:45:21
【问题描述】:
我很难弄清楚这个析构函数是如何调用的
所以我有一个带有虚拟析构函数和内联虚拟克隆函数的 A 类
class A{
public:
A(){ }
virtual ~A(){
qDebug() << "Class A destructor";
}
inline virtual A *clone(){
return NULL;
}
};
然后我有子类 B 也有析构函数和克隆函数返回指向类 A 的指针
class B : public A{
public:
B() { }
~B(){
qDebug() << "Class B destructor";
}
A *clone(){
B *temp = new B();
return static_cast<A *>(temp);
}
};
我有主函数和测试函数,我开始对指针做一些疯狂的事情
A *test(A *input){
return input->clone();
}
int main(){
B temp2;
A *temp = test(&temp2);
delete temp;
return 0;
}
最后如果我有输出是
Class B destructor
Class A destructor
Class B destructor
Class A destructor
如果我在析构函数类 A 之前没有使用 virtual,我的输出是
Class A destructor
Class B destructor
Class A destructor
那么谁能解释一下为什么虚拟会有这么大的不同
【问题讨论】:
-
这与克隆功能无关。创建一个只包含
A* x = new B(); delete x;的 main 函数,看看有无虚拟析构函数会发生什么。 -
delete temp;其中 temp 的动态类型是B*而静态类型是A*非虚拟析构函数是 UB。
标签: c++ pointers subclass virtual