c ++继承默认构造函数

时间:2014-06-16 19:49:46

标签: c++ inheritance default

  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

为什么在打印“B ctor”之前打印2次“A ctor” 以及为什么在程序结束时打印“A copy ctor”,“A op =”,“A dctor”?? * /

1 个答案:

答案 0 :(得分:1)

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

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

    此外,您可能希望格式化并更好地提出您的问题,或者有人会对它们进行投票。