class A { int* a; };
class B : public A { int*b; };
int main() {
A* ptr = new B();
delete ptr;
}
class A
是纯虚拟接口类,class B
继承自class A
。当我们删除ptr
将调用哪个析构函数时?来自A
类的那个或来自B
类的那个?
答案 0 :(得分:2)
评论:首先,为什么你有任何功能以外的代码?语句只有在函数体内时才有意义,例如main
。
假设您发布的语句应该进入main
:
<强>答案:强>
delete ptr
将调用A的析构函数。编译器不会认为&#39;除此之外。
原因:默认情况下,所有方法(包括析构函数)都是非虚拟的。在您的情况下,您没有指定析构函数应该是虚拟的。编译器看到你在A*
指针上调用析构函数,因此它调用了A
的析构函数。
如果我指定A类析构函数是虚拟的,该怎么办?它还会调用A类的析构函数吗?
答案:如果是virtual
,它会调用B
的析构函数,因为在执行程序时会确定对象的实际类型。
详细了解虚函数和多态here。