Конструктор базовой копии не вызывается - PullRequest
5 голосов
/ 01 октября 2009
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();
      }
};

Если я это сделаю Производное d1; Производная d2 = d1; Вызывается конструктор копирования базы и вызывается конструктор копирования производных по умолчанию.

Но если я удаляю комментарии из конструктора копии производного, базовый конструктор копии не вызывается. Есть ли какая-то конкретная причина для этого? Заранее спасибо.

Ответы [ 6 ]

16 голосов
/ 01 октября 2009

Я думаю, вы должны явно вызвать конструктор базовой копии:

  Derived (Derived& d) : Base(d)
  {
      cout<<"Derived copy Constructor"<<endl;
      i = d.i; 
  }
13 голосов
/ 01 октября 2009

Если вы хотите прочитать фактическое правило, вам следует обратиться к стандарту C ++ 12.8 / 8:

Неявно определенный конструктор копирования для класса X выполняет пошаговую копию своих подобъектов. порядок копирования такой же, как порядок инициализации баз и элементов в определяемой пользователем конструкции. тор (см. 12.6.2). Каждый подобъект копируется способом, соответствующим его типу:

  • если подобъект имеет тип класса, используется конструктор копирования для класса;
  • если подобъект является массивом, каждый элемент копируется способом, соответствующим типу элемента;
  • если подобъект скалярного типа, используется встроенный оператор присваивания.

Когда вы явно определяете конструктор копирования, вы должны явно вызывать копию c-tor базового класса.

4 голосов
/ 01 октября 2009

В вашем Derived конструкторе копирования вам нужно добавить следующее:

Derived (const Derived &d) : Base(d) { }
2 голосов
/ 01 октября 2009

C ++ не выполняет никаких «сопоставлений с конструкторами». Если вы явно не вызываете конструктор базового класса, вызывается конструктор по умолчанию (ну, технически подобъект базового класса «инициализирован значением», но для классов с конструкторами это то же самое).

1 голос
/ 01 октября 2009

вы должны прочитать это : это объясняет, как работают наследование и специальные члены, такие как конструкторы.

0 голосов
/ 01 октября 2009

Большое спасибо. Я понял. Это означает, что вызов конструктора копирования базового класса выполняется автоматически в производном конструкторе копирования по умолчанию. Принимая во внимание, что во втором случае, поскольку я пишу конструктор копирования производного, я должен сделать явный вызов конструктора копирования базы. Еще раз спасибо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...