C++ 继承层次结构中的析构函数排序

C++ 继承层次结构中的析构函数排序,c++,inheritance,polymorphism,virtual-destructor,C++,Inheritance,Polymorphism,Virtual Destructor,如果我具有以下层次结构: 类F包含类型的成员对象(类E和类D,按该顺序声明) 类F继承了具体的类C 类C继承抽象/纯虚拟类B 类B继承了具体的类A 如果调用类型为F的对象的析构函数,则以下顺序发生: 类F(最派生的)析构函数被调用并完成 类D(成员对象2)析构函数被调用并完成 类E(成员对象1)析构函数被调用并完成 类C(F的基)析构函数被调用并完成 类A(B的基,C的基)析构函数被调用并完成 类B(虚拟,C的基)析构函数被调用并完成 这是正确的吗?所以基本上在接近尾声时,C继承了虚B,虚B

如果我具有以下层次结构:

  • 类F包含类型的成员对象(类E和类D,按该顺序声明)
  • 类F继承了具体的类C
  • 类C继承抽象/纯虚拟类B
  • 类B继承了具体的类A
如果调用类型为F的对象的析构函数,则以下顺序发生:

  • 类F(最派生的)析构函数被调用并完成
  • 类D(成员对象2)析构函数被调用并完成
  • 类E(成员对象1)析构函数被调用并完成
  • 类C(F的基)析构函数被调用并完成
  • 类A(B的基,C的基)析构函数被调用并完成
  • 类B(虚拟,C的基)析构函数被调用并完成
  • 这是正确的吗?所以基本上在接近尾声时,C继承了虚B,虚B继承了A,但是C被破坏了,然后是A,然后是虚B

    <>编辑:C++ FAQS说:

    “虚拟基类是特殊的-它们的析构函数在 最派生类的构造函数结尾“


    这就是我想要理解的?

    析构函数以与构造函数相反的顺序执行。这几乎是你需要知道的全部


    更新:它甚至适用于虚拟基地。您只需认识到,虚拟基类是在任何其他基类之前构造的。

    析构函数的执行顺序与构造函数的执行顺序相反。这几乎是你需要知道的全部


    更新:它甚至适用于虚拟基地。您只需认识到,虚拟基是在任何其他基类之前构造的。

    也许将析构函数调用的顺序表示为算法是最简单的

    毁灭
  • 执行程序员在析构函数体中编写的任何操作:
    F::~F(){Do_this;Do_this;}
  • 销毁(为)成员调用析构函数
  • 销毁(为)非虚拟基类调用析构函数
  • 销毁(调用)虚拟基类的析构函数
  • 该算法由语言(或编译器)执行,因此程序员只能控制第一步

    注意:后面的每个步骤都是递归的

    析构函数调用的顺序与构造函数调用的顺序相反(最好知道,因为构造顺序是直观的)。虚拟基地的销毁顺序规定为

    基类图的深度优先从左到右遍历


    幸运的是,您不需要它,因为您只有一个。也许将析构函数调用的顺序表示为算法是最简单的

    毁灭
  • 执行程序员在析构函数体中编写的任何操作:
    F::~F(){Do_this;Do_this;}
  • 销毁(为)成员调用析构函数
  • 销毁(为)非虚拟基类调用析构函数
  • 销毁(调用)虚拟基类的析构函数
  • 该算法由语言(或编译器)执行,因此程序员只能控制第一步

    注意:后面的每个步骤都是递归的

    析构函数调用的顺序与构造函数调用的顺序相反(最好知道,因为构造顺序是直观的)。虚拟基地的销毁顺序规定为

    基类图的深度优先从左到右遍历


    幸运的是,你不需要这个,因为你只有一个。< /P>是的,但是我读到了虚拟类的析构函数在结尾被调用,不管它们在层次结构中的位置是什么?C++ 272个FAQ,第三页说“虚拟基类是特殊的——它们的析构函数在最派生类的构造函数的结尾被调用”。那么在我的示例中,这是否意味着紧跟在类F之后?@user997112:您真的应该添加代码,而不是描述层次结构是什么。。。你真的在使用

    virtual
    继承吗?这在描述中并不清楚。请用真实的代码更新这个问题。@ DavidRodr的Guez Dr.DeBeas,我没有代码,我试图理解C++ FAQ引用的含义。@ USER 99 7112:不清楚你的意思是抽象的/纯的虚拟类,我认为你理解你所写的,只需使用基本C++来布局代码……是的,但是我读到了虚拟类的析构函数在结尾被调用,不管它们在层次结构中的位置是什么?C++ 272个常见问题解答,第三页说“虚拟基类是特殊的——它们的析构函数在最派生类的构造函数的结尾被调用”。那么在我的示例中,这是否意味着紧跟在类F之后?@user997112:您真的应该添加代码,而不是描述层次结构是什么。。。你真的在使用
    virtual
    继承吗?这在描述中并不清楚。请用真实的代码更新这个问题。@ DavidRodr的Guez Dr.DeBeas,我没有代码,我试图理解C++ FAQ引用的含义。@ USER 99 7112:不清楚你的意思是抽象的/纯的虚拟类,我认为你理解你所写的,只需使用基本C++来布局代码……描述就有点混乱:它不是虚拟的类,而是继承。所以你的类C实际上继承了类B,或者你可以说B是C的一个虚拟基。当然,B是抽象的,它包含纯虚函数,但是构造函数/析构函数的顺序并不重要。@anatolyg那么你会如何重新编写C++常见问题解答,因为我完全被它说的话弄糊涂了?描述有点混乱:它不是一个虚拟类,而是继承。所以你的类C实际上继承了类B,或者你可以说B是C的一个虚拟基。当然,B是抽象的,它包含纯虚拟函数,但它与构造函数/析构函数的顺序无关。@anatolyg那么你会如何重新命名C++常见问题,因为我完全被我所说的混淆了