views:

406

answers:

6
class Base
{
      public:
      int i;

      Base()
      {
          cout<<"Base Constructor"<<endl;
      }

      Base (Base& b)
      {
          cout<<"Base Copy Constructor"<<endl; 
          i = b.i; 
      }


      ~Base()
      {
          cout<<"Base Destructor"<<endl;
      }

      void val()
      {
             cout<<"i: "<< i<<endl;
      }      
};

class Derived: public Base
{
      public:
      int i;

      Derived()
      {
          Base::i = 5;     
          cout<<"Derived Constructor"<<endl;
      }

      /*Derived (Derived& d)
      {
          cout<<"Derived copy Constructor"<<endl;
          i = d.i; 
      }*/

      ~Derived()
      {
          cout<<"Derived Destructor"<<endl;
      }      

      void val()
      {
             cout<<"i: "<< i<<endl;
             Base::val();
      }
};

If i do Derived d1; Derived d2 = d1; The copy constructor of base is called and default copy constructor of derived is called.

But if i remove the comments from derived's copy constructor the base copy constructor is not called. Is there any specific reason for this? Thanks in advance.

+3  A: 

I think you have to explicitly call the base copy constructor:

  Derived (Derived& d) : Base(d)
  {
      cout<<"Derived copy Constructor"<<endl;
      i = d.i; 
  }
tster
+1  A: 

In your Derived copy constructor, you need to add the following:

Derived (const Derived &d) : Base(d) { }
Nick Bedford
+1  A: 

C++ doesn't do any kind of "constructor matching". If you do not explicitly call the base class constructor, the default one is called (well, technically, the base class subobject is "value initialized", but for classes with constructors this is the same thing).

Pavel Minaev
A: 

you should read this: it explain how inheritance & special members like constructors are working.

RC
+2  A: 

If you want to read actual rule you should refer to C++ Standard 12.8/8:

The implicitly-defined copy constructor for class X performs a memberwise copy of its subobjects. The order of copying is the same as the order of initialization of bases and members in a user-defined construc- tor (see 12.6.2). Each subobject is copied in the manner appropriate to its type:

  • if the subobject is of class type, the copy constructor for the class is used;
  • if the subobject is an array, each element is copied, in the manner appropriate to the element type;
  • if the subobject is of scalar type, the built-in assignment operator is used.

When you define copy constructor explicitly you should call copy c-tor of base class explicitly.

Kirill V. Lyadvinsky
A: 

Thank you very much. I got it. It means that the call to the base class copy constructor is automagivccally done in the derived's default copy constructor. Whereas in the second case since i am writing the derived's copy constructor i must make an explicit call to the base's copy constructor. Thanks again

nitin soman