Вызов конструктора копирования базового класса при создании объекта производного класса путем копирования другого объекта производного класса - PullRequest
2 голосов
/ 01 сентября 2011
class base {};
class der : public base{};


der d1;
der d2(d1);

Этот оператор вызывает конструктор по умолчанию класса base, а затем копирует конструктор claas der. Мой вопрос заключается в том, почему в C ++ не предусмотрена функция вызова конструктора копирования базового класса при создании объекта производного класса путем копирования другого объекта производного класса

Ответы [ 4 ]

6 голосов
/ 01 сентября 2011

Короткая версия

Этот оператор вызывает конструктор по умолчанию класса base, а затем копирует конструктор claas der.

Нет, это не так.

Мой вопрос заключается в том, почему в C ++ не предусмотрена функция вызова конструктора копирования базового класса при создании объекта производного класса путем копирования другого объекта производного класса

Это действительно так.


Длинная (er) версия

Я не знаю, как вы пришли к выводу, что базовый конструктор по умолчанию вызывается при построении d2, но это не так.Как и ожидалось, синтезированный базовый конструктор копирования вызывается .

Это действительно легко проверить :

struct base {
   base() { cout << "*B"; }
   base(base const& b) { cout << "!B"; }
  ~base() { cout << "~B"; }
};

struct der : base {};

int main() {
   der d1;
   der d2(d1);
}

// Output: *B!B~B~B
0 голосов
/ 14 июня 2013

Конструктор копирования производного класса вызывает конструктор по умолчанию базового класса.

Ниже примеры программ демонстрируют то же самое.

#include <iostream>

using namespace std;

class Base
{
public:
    Base(){ cout<<"Base"<<endl; }
    Base(int i){ cout<<"Base int "<<endl; }
    Base(const Base& obj){ cout<<"Base CC"<<endl; }
};

class Derv : public Base
{
public:
    Derv(){ cout<<"Derv"<<endl; }
    Derv(int i){ cout<<"Derv int "<<endl; }
    Derv(const Derv& obj){ cout<<"Derv CC"<<endl; }
};

int main()
{
    Derv d1 = 2;
    Derv d2 = d1; // Calls the copy constructor

    return 0;
}
0 голосов
/ 01 сентября 2011

Сгенерированный компилятором конструктор копирования вызовет конструктор копирования базового класса.

Возможно, вы добавили определяемый пользователем конструктор копирования для der.В таком случае вы должны явно вызвать конструктор копирования базового класса.

der::der(const der& other): base(other), ... {}
0 голосов
/ 01 сентября 2011

Этот оператор вызывает конструктор по умолчанию класса base, а затем копирует конструктор claas der.

Нет, это не так.

Первая строка вызывает конструкцию по умолчанию класса der, которая вызывает конструктор по умолчанию класса base. Вторая строка вызывает конструктор копирования класса der, потому что вы копируете один экземпляр der в другой.

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