如何从派生的类复制构造函数中调用复制构造函数

How is the copy constructor being invoked from derived class copy constructor?

本文关键字:复制 构造函数 调用 派生      更新时间:2023-10-16

我有一个以下程序,我想知道如何调用基类的复制构造函数。

#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

由于我没有调用派生类隐式复制构造函数中的复制构造函数。但是如何从那里调用基类的复制构造函数。有人可以告诉内部机制。

由于我没有调用派生类隐式复制构造函数中的复制构造函数。

正确。

但是如何从那里调用基类的复制构造函数。

不清楚您的意思是"如何"。隐式复制构造函数复制所有子对象。这包括基本子对象。

我找到了我正在寻找的答案。

由于派生类没有明确的复制构造函数,因此编译器定义了自己的复制构造函数,并且该复制构造函数具有调用复制构造函数的初始化列表。

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);
}

在上述代码中,如果删除B类复制构造函数中的初始化列表中存在的(OBJ),则会获得编译错误。因此,很明显,当您具有需要在基类构造函数上传递的任何变量,作为其初始化的一部分,派生类的隐式复制构造函数也提供了一个初始化列表,在该列表中调用了基类复制构造函数。