C ++ - 删除多态指针

时间:2017-04-24 19:10:34

标签: c++ inheritance virtual

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类的那个?

1 个答案:

答案 0 :(得分:2)

评论:首先,为什么你有任何功能以外的代码?语句只有在函数体内时才有意义,例如main

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

<强>答案: delete ptr将调用A的析构函数。编译器不会认为&#39;除此之外。

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

  

如果我指定A类析构函数是虚拟的,该怎么办?它还会调用A类的析构函数吗?

答案:如果是virtual,它会调用B的析构函数,因为在执行程序时会确定对象的实际类型。

详细了解虚函数和多态here