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。
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。