Копирование конструкции по всей цепочке наследования - PullRequest
0 голосов
/ 29 апреля 2018

Разве нельзя использовать конструкторы копирования по всей цепочке наследования?

#include<iostream>
using namespace std;
class A
{
public:
     A(){ cout <<"1";}
     A(const A &obj){ cout <<"2";}
};

class B: virtual public A
{
public:
    B(){cout <<"3";}
    B(const B & obj){cout<<"4";}
};

class C: virtual public A
{
public:
   C(){cout<<"5";}
   C(const C & obj){cout <<"6";}
};

class D:B,C
{
public:
    D(){cout<<"7";}
    D(const D & obj){cout <<"8";}
};

int main()
{
   D d1;
   D d(d1);
}

Выход:

13571358

Ожидаемое:

13572468

Ответы [ 2 ]

0 голосов
/ 29 апреля 2018

Разве не будут использоваться конструкторы копирования по всей цепочке наследования?

Это будет, если вы оставите компилятор, чтобы сделать это для вас. Поскольку вы определили это сами, вам нужно поступить правильно.

D(const D & obj){cout <<"8";}

эквивалентно:

D(const D & obj) : A(), B(), C() {cout <<"8";}

Вам необходимо использовать:

D(const D & obj) : A(obj), B(obj), C(obj) {cout <<"8";}

чтобы убедиться, что конструкторы копирования базовых классов вызываются.

0 голосов
/ 29 апреля 2018

Конструктор копирования используется только для D, поскольку конструктор копирования D не вызывает конструкторы копирования своих базовых классов.

Должен быть объявлен как

D(const D &obj): A(obj), B(obj), C(obj) {cout <<"8";}

если я что-то не опечатал.

Объект A необходимо скопировать здесь, поскольку он является виртуальным базовым классом, созданным в самом производном классе.

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