未调用基本复制构造函数

nit*_*man 5 c++ inheritance

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();
      }
};
Run Code Online (Sandbox Code Playgroud)

如果我做Derived d1; 派生d2 = d1; 调用base的复制构造函数并调用derived的默认复制构造函数.

但是,如果我从派生的复制构造函数中删除注释,则不会调用基本复制构造函数.这有什么具体原因吗?提前致谢.

tst*_*ter 16

我认为你必须显式调用基本拷贝构造函数:

  Derived (Derived& d) : Base(d)
  {
      cout<<"Derived copy Constructor"<<endl;
      i = d.i; 
  }
Run Code Online (Sandbox Code Playgroud)


Kir*_*sky 13

如果您想阅读实际规则,请参阅C++标准12.8/8:

类X的隐式定义的复制构造函数执行其子对象的成员副本.复制的顺序与用户定义的构造函数中基数和成员的初始化顺序相同(见12.6.2).每个子对象都以适合其类型的方式复制:

  • 如果子对象是类类型,则使用该类的复制构造函数;
  • 如果子对象是一个数组,则以适合于元素类型的方式复制每个元素;
  • 如果子对象是标量类型,则使用内置赋值运算符.

明确定义复制构造函数时,应该显式调用基类的复制c-tor.