C++ 无法理解析构函数调用序列 类基{ 公众: ~base(){ cout

C++ 无法理解析构函数调用序列 类基{ 公众: ~base(){ cout,c++,inheritance,destructor,C++,Inheritance,Destructor,析构函数是按相反的声明顺序调用的。因此,一旦调用了derived2的析构函数,则调用derived的dtor,而不是base。因此,基类的第三个输出由derived2类调用。一旦调用完成,继承的derived2剩下的一个类将被调用base,因此第四个输出来自derived2类。 总结如下: 第一个输出来自derived2类 第二个输出来自由derived2类继承的派生类 第三个输出来自派生类继承的基类 第四个输出来自由derived2类继承的基类 析构函数是按相反的声明顺序调用的。因此,一旦调

析构函数是按相反的声明顺序调用的。因此,一旦调用了
derived2
的析构函数,则调用
derived
的dtor,而不是
base
。因此,基类的第三个输出由
derived2
类调用。一旦调用完成,继承的
derived2
剩下的一个类将被调用
base
,因此第四个输出来自
derived2
类。

总结如下:

  • 第一个输出来自derived2类
  • 第二个输出来自由derived2类继承的派生类
  • 第三个输出来自派生类继承的基类
  • 第四个输出来自由derived2类继承的基类

  • 析构函数是按相反的声明顺序调用的。因此,一旦调用了
    derived2
    的析构函数,则调用
    derived
    的dtor,而不是
    base
    。因此,基类的第三个输出由
    derived2
    类调用。一旦调用完成,继承的
    derived2
    剩下的一个类就是
     基本
    ,因此第四个输出来自
    derived2
    类。

    总结如下:

  • 第一个输出来自derived2类
  • 第二个输出来自由derived2类继承的派生类
  • 第三个输出来自派生类继承的基类
  • 第四个输出来自由derived2类继承的基类
  • 1)析构函数按从最派生到基的相反顺序调用

    2)每个非虚拟基类的销毁顺序与其声明顺序相反

    因此,在你的情况下:

    我们从一个
    derived2
    开始,到它最后声明的基(
    derived
    )销毁它(销毁
    derived
    ,然后销毁
    base
    ),然后回来销毁另一个基,即
    base

    有关虚拟基的更多详细信息和一般情况,请参见。

    1)析构函数按从最派生基到基的相反顺序调用

    2)每个非虚拟基类的销毁顺序与其声明顺序相反

    因此,在你的情况下:

    我们从一个
    derived2
    开始,到它最后声明的基(
    derived
    )销毁它(销毁
    derived
    ,然后销毁
    base
    ),然后回来销毁另一个基,即
    base


    有关更多详细信息和虚拟基地的一般情况,请参见。

    您是否看到这种销毁顺序:

    class base{
        public:
            ~base(){
                 cout<<"base class delete"<<endl;
            }   
    };
    
    class derived:public base{
        public:
            ~derived(){
                cout<<"derived class 1 delete"<<endl; 
            }
    };
    
    class derived2:public base,public derived{
        public:
            ~derived2(){
                cout<<"derived class 2 delete"<<endl;
            }
    };
    
    int main(){
        derived2 h; 
        return 0;
    }
    
    说明:

    • (a) 调用派生2的析构函数

    • (b)
      cout你看到这种破坏顺序了吗:

      class base{
          public:
              ~base(){
                   cout<<"base class delete"<<endl;
              }   
      };
      
      class derived:public base{
          public:
              ~derived(){
                  cout<<"derived class 1 delete"<<endl; 
              }
      };
      
      class derived2:public base,public derived{
          public:
              ~derived2(){
                  cout<<"derived class 2 delete"<<endl;
              }
      };
      
      int main(){
          derived2 h; 
          return 0;
      }
      
      说明:

      • (a) 调用派生2的析构函数

      • (b)
        cout析构函数按与构造函数相反的顺序执行

        • 这里,销毁从“类派生2”开始(因此,它的析构函数被称为第一个)

        • 然后,最后一个继承的类通过调用其destroctor:~Deserived(){}被销毁(即类派生)。它继承了一个类,即“class base”,因此其destroctor被称为:~base(){}

        • 最后,通过调用其析构函数:~base(){}来销毁由“class-derived 2”继承的第一个类(即class-base)


        析构函数按与构造函数相反的顺序执行

        • 这里,销毁从“类派生2”开始(因此,它的析构函数被称为第一个)

        • 然后,最后一个继承的类通过调用其destroctor:~Deserived(){}被销毁(即类派生)。它继承了一个类,即“class base”,因此其destroctor被称为:~base(){}

        • 最后,通过调用其析构函数:~base(){}来销毁由“class-derived 2”继承的第一个类(即class-base)


        您无法理解的具体内容是什么?在此输出中,您认为什么是奇怪的?您无法理解的具体内容是什么?在此输出中,您认为什么是奇怪的?是什么提示了此问题?此答案是否包括先前答案中未提及的内容?此答案是否包括任何未提及的内容“你在前面的回答中没有说过吗?