Как вызывается конструктор копирования из конструктора копирования производного класса? - PullRequest
0 голосов
/ 17 марта 2019

У меня есть программа ниже, и мне интересно, как вызывается конструктор копирования базового класса.

#include <iostream>
using namespace std;
class Base
{
    int a;
    public:
    Base(int xinput):a(xinput)
    {
        cout<<"Base Ctor:" << a<<endl;

        counter++;
    }
    Base(const Base &obj)
    {

        a=obj.a;
        cout<<"base copy ctr:"<<a<<endl;
        counter++;
    }
    void printcounter()
    {
        cout<<"Base counter:"<<counter<<endl;
    }
    virtual ~Base()
    {
        cout<<"Base Dtor:"<<a<<endl;
        counter--;
    }
    protected:
    static int counter;
};

class Derived:public Base
{
    int b;
    public:
    Derived(int xinput,int yinput):Base(xinput),b(yinput)
    {
        cout<<"Derived Ctor:" << b<<endl;

        counter++;
    }
    void printcounter()
    {
        cout<<"Derived counter:"<<counter<<endl;
    }
     ~Derived()
    {
        cout<<"Derived Dtor:" <<b<<endl;
        counter--;
    }
};
int Base::counter = 0;
Derived d(22,22);
int main()
{
    {
        Derived D(d);          
        Base *bptr = new Derived(d);
        bptr->printcounter();
        delete bptr;
        d.printcounter();

    }
    d.printcounter();

    return 0;
}

вывод такой, как показано ниже.

Base Ctor:22
Derived Ctor:22
base copy ctr:22 //Why is base copy Ctor invoked
base copy ctr:22
Base counter:4
Derived Dtor:22
Base Dtor:22
Derived counter:2
Derived Dtor:22
Base Dtor:22
Derived counter:0
Derived Dtor:22
Base Dtor:22

Так как я не определилКонструктор копирования в производном классе вызывается неявным конструктором копирования.Но как оттуда вызывается конструктор копирования Базового класса?Может кто-нибудь подскажет внутренний механизм.

Ответы [ 2 ]

1 голос
/ 17 марта 2019

Поскольку я не определил конструктор копирования в производном классе, вызывается неявный конструктор копирования.

Correct.

Но как оттуда вызывается конструктор копирования Базового класса.

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

0 голосов
/ 17 марта 2019

Я нашел ответ, который искал.

Поскольку производный класс не имеет явного конструктора копирования, компилятор определяет свой собственный конструктор копирования, и этот конструктор копирования имеет список инициализации, в котором вызывается конструктор копирования..

class A
{
    public:
    int a;
    A(int x){cout<<"A::Default ctr"<<endl;}
    A(const A& obj){cout<<"A::copy Ctr"<<endl;}
};

class B:public A
{
    public:
    B(int x):A(x){cout<<"B::Default ctr"<<endl;}
    B(const B& obj):A(obj)
    {cout<<"B::copy Ctr"<<endl;}
};
int main()
{
        B bobj(10);
        B b1obj(bobj);
}

В приведенном выше коде, если вы удалите A (obj), присутствующий в списке инициализации конструктора копирования класса B, вы получите ошибку компиляции.Таким образом, становится ясно, что когда у вас есть переменная, которую необходимо передать конструктору базового класса в рамках его инициализации, неявный конструктор копирования производного класса также предоставляет список инициализаторов, где вызывается конструктор копирования базового класса.

...