C++ c++;继承默认构造函数

C++ c++;继承默认构造函数,c++,inheritance,default,C++,Inheritance,Default,为什么在打印“B ctor”之前先打印两次“A ctor” 为什么要在程序的末尾打印“一个复制ctor”、“一个op=”、“一个dctor”*/ 它在B之前打印A两次,因为: 第一次是因为B派生自A,所以它是基类的实例化 第二次是因为B包含A的一个实例作为成员变量。在调用B的构造函数之前,它也会被实例化 最后,会打印出的复制构造函数、赋值op和析构函数,因为foo()返回的是by值的实例,所以需要将其复制到目标中 另外,你可能想把你的问题编排得更好一些,或者有人会投反对票。眨眼标签到底在那里干什

为什么在打印“B ctor”之前先打印两次“A ctor” 为什么要在程序的末尾打印“一个复制ctor”、“一个op=”、“一个dctor”*/


它在B之前打印A两次,因为:

  • 第一次是因为B派生自A,所以它是基类的实例化
  • 第二次是因为B包含A的一个实例作为成员变量。在调用B的构造函数之前,它也会被实例化
  • 最后,会打印出的复制构造函数、赋值op和析构函数,因为foo()返回的是by值的实例,所以需要将其复制到目标中


    另外,你可能想把你的问题编排得更好一些,或者有人会投反对票。

    眨眼标签到底在那里干什么?关于主题,这个程序不编译,更不用说打印任何东西了。但这似乎是一个很容易回答的问题。
      class A{
           public:
               A(){ cout << “A ctor” << endl; }//default A constructor
               A(const A& a){ cout <<“A copy ctor”<< endl; }//copy constructor
               virtual ~A(){ cout <<“A dtor”<< endl; }//destructor
               virtual void foo(){ cout <<”A foo()” << endl; }
               virtual A& operator=(const A& rhs){ cout << “A op=” << endl; }//operator
        };
    
    class B:public A{
       public:
           B(){ cout <<“B ctor”<< endl; }//default B constructor 
           virtual ~B(){ cout <<”B dtor”<< endl; }//destructor
           virtual void foo(){ cout <<”B foo()”<< endl; }
       protected:
           A mInstanceOfA;
    }; 
    
    A foo(A& input){
        input.foo();
        return input;
    }
    
    
    Int main(){
        B myB;
        B myOtherB;
        A myA;
        myOtherB=myB;
        myA=foo(myOtherB);
    }
    
    A ctor
    A ctor
    B ctor
    A ctor
    A ctor
    B ctor
    A ctor
    A op=
    A op=
    B foo()
    A copy ctor
    A op=
    A dctor