C++ 调用抽象类';析构器

C++ 调用抽象类';析构器,c++,virtual-destructor,C++,Virtual Destructor,我有三节课 class Son : public Father; class Father : public Grandfather; 父亲和祖父都是抽象的子不是抽象的 如果我这样做: Son* son = new Son(); 然后这样做: delete(son) 如何确保调用父类和父类的析构函数?指向指针的父类析构函数将被调用,无论发生什么情况 不过,您应该将顶级类的析构函数设置为虚拟的,这样就可以删除指向祖父的指针,并确保所有子类的析构函数都被调用。不这样做会导致未定义的行为,这总

我有三节课

class Son : public Father;

class Father : public Grandfather;
父亲和祖父都是抽象的<代码>子不是抽象的

如果我这样做:

Son* son = new Son();
然后这样做:

delete(son)

如何确保调用
父类
父类
的析构函数?

指向指针的父类析构函数将被调用,无论发生什么情况

不过,您应该将顶级类的析构函数
设置为虚拟的
,这样就可以删除指向
祖父的指针
,并确保所有子类的析构函数都被调用。不这样做会导致未定义的行为,这总是一件坏事


一旦一个函数是虚拟的,它在整个派生树中都是虚拟的,不需要在子类中标记它。然而,这样做通常是很好的形式,它有助于人们阅读代码。

只要他们有虚拟析构函数,就可以了。@chris如果你要删除指向最派生类的指针,你甚至不需要它。@KerrekSB,类的一个实例
Son
@l19希望它是像
Son*Son=new-Son,对吗?@l19:在这种情况下,您的代码甚至无法编译。你只能在指针上调用
delete
。如果它不是虚拟的,问题不在于派生类型的析构函数没有被调用;这是因为行为是未定义的。语言定义不会告诉您这样做时会发生什么。@Collin必须在子类中将其标记为虚拟,才能使该子类中的方法成为虚拟的。@user1610015 Um。。否。引用标准:10.3第2段:“如果虚拟成员函数vf在类基中声明,并且在从基派生、直接或间接派生的类中声明,则成员函数vf具有相同的名称、参数类型列表(8.3.5)、cv限定和引用限定符(或没有相同的)声明Base::vf时,派生::vf也是虚拟的(无论是否如此声明)