логика вызова конструктора копирования - PullRequest
1 голос
/ 14 сентября 2011
class base {
public:
    base(){
        cout << "base constructor" << endl;
    }
    base(const base& rh) {
        cout << "base copy constructor" << endl;
    }
};

//case 1:
class der : public base {
};

//case 2: 
class der : public base {
public:
    der(){
        cout << "der constructor" << endl;
    }
    der(const der& rh) {
        cout << "der copy constructor" << endl;
    }
};

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

случай 1: der d1 (d);вызывает конструктор копирования базового класса, тогда как в

case-2 вызывается конструктор по умолчанию базового класса и конструктор копирования класса der.

Кто-нибудь может объяснить логику?

Ответы [ 4 ]

3 голосов
/ 14 сентября 2011

В случае 1 вы получаете конструктор копирования по умолчанию, синтезированный компилятором.Это определено для копирования баз и членов.

В случае 2 вы определили свой собственный конструктор копирования, который выполняет то, что вы говорите.Вы ничего не поместили в список инициализатора для базового класса, поэтому база построена по умолчанию [*], как и любой другой конструктор, который не инициализирует базу явно.Если бы у der были какие-либо элементы данных, они не были бы скопированы.

[*] или один из других видов инициализации, что равносильно тому же для классов не POD.Я никогда не могу вспомнить эти детали.

2 голосов
/ 14 сентября 2011

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

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

class base {
public:
    base(int i):m_i(i){
        cout << "base constructor" << endl;
    }
    base(const base& rh) {
        m_i = rh.m_i;
        cout << "base copy constructor" << endl;
    }
private:
int m_i;
};

//case 2: 
class der : public base {
public:
    der(int i,int j):base(i),m_j(j){
        cout << "der constructor" << endl;
    }
    der(const der& rh):base(rh) {
        m_j = rh.m_j;
        cout << "der copy constructor" << endl;
    }
private:
    int m_j;
};

int main() {
 der d(1,2);
 der d1(d); //d1.m_i = 1, d1.m_j = 2
}

//result
//base copy constructor
//der copy constructor
0 голосов
/ 14 сентября 2011

В основном, есть вызов на один экземпляр-кон. Таким образом, в случае-2 вызывается copy-con of der, и, если хотите, вы можете использовать copy-con базы в коде. В первом случае, поскольку вы не реализовали функцию copy-con in der, она вызывает функцию из его базы, как это было бы с любой функцией, которая реализована только в базовом классе.

0 голосов
/ 14 сентября 2011

В первом случае вы не указываете конструкторы для der, поэтому компилятор решает за вас, то есть копирует данные d в d1 индивидуально, вызывая в процессе конструктор копирования base .

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

...