C++ C++;-删除多态指针

C++ C++;-删除多态指针,c++,inheritance,virtual,C++,Inheritance,Virtual,class A是一个纯虚拟接口类,class B继承自class A。当我们删除ptr时,将调用哪个析构函数?A类中的一个或B类中的一个?注释:首先,为什么在任何函数之外都有代码?语句只有在函数体中存在时才有意义,如main 假设您发布的语句应该进入main: 回答: delete ptr将调用A的析构函数。编译器不会“思考”更多 原因:默认情况下,所有方法(包括析构函数)都是非虚拟的。在您的例子中,您没有指定析构函数应该是虚拟的。编译器看到您在a*指针上调用析构函数,因此它调用a的析构函数

class A
是一个纯虚拟接口类,
class B
继承自
class A
。当我们删除ptr时,将调用哪个析构函数?
A
类中的一个或
B
类中的一个?

注释:首先,为什么在任何函数之外都有代码?语句只有在函数体中存在时才有意义,如
main

假设您发布的语句应该进入
main

回答:
delete ptr
将调用A的析构函数。编译器不会“思考”更多

原因:默认情况下,所有方法(包括析构函数)都是非虚拟的。在您的例子中,您没有指定析构函数应该是虚拟的。编译器看到您在
a*
指针上调用析构函数,因此它调用
a
的析构函数



如果我指定类A析构函数是虚拟的呢?它还会调用类A的析构函数吗

回答:如果它是
virtual
,它将调用
B
的析构函数,因为对象的实际类型将在程序执行期间确定


请参阅有关虚拟函数和多态性的更多信息。

您所说的“纯虚拟接口类”是什么意思,以及为什么您认为A是一个?另请参阅:
A
中的一个,这就是为什么作为运行时多态对象基类的类应该声明一个虚拟析构函数(
virtual~A(){}
),既不可编译也不清楚。发布一个正确的。可能的副本,如果我指定类a析构函数是虚拟的呢?它还会调用A类的析构函数吗;请参见编辑我的帖子。请把代码发回来;没有它,我的回答毫无意义。只需将语句放入
主函数中即可。谢谢。我相信代码已经足够了,因为您已经回答了我的问题。它本可以从邮寄中获益——这是肯定的。但我想我会删除这个问题,因为它得到了这么多的反对票。祝你学习C++!我已经把代码发回来了。但你的回答真的很好,所以我会把它放在某个地方,供我自己将来参考。社区似乎不喜欢它。不知道为什么。
class A { int* a; };
class B : public A { int*b; };

int main() {
    A* ptr = new B();
    delete ptr;
}