C++ - 删除多态指针

C++ - Deleting a polymorphic pointer

class A { int* a; };
class B : public A { int*b; };

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

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

的那一位

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

假设您发布的声明应该进入 main:

答案: delete ptr 将调用 A 的析构函数。编译器不会 'think' 比这更进一步。

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

的析构函数

What if I had specified that Class A destructor was virtual? Would it still call the destructor of Class A?

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

查看有关虚函数和多态性的更多信息here