如何从派生的类复制构造函数中调用复制构造函数
How is the copy constructor being invoked from derived class copy constructor?
我有一个以下程序,我想知道如何调用基类的复制构造函数。
#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),则会获得编译错误。因此,很明显,当您具有需要在基类构造函数上传递的任何变量,作为其初始化的一部分,派生类的隐式复制构造函数也提供了一个初始化列表,在该列表中调用了基类复制构造函数。
相关文章:
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 为什么在C++中使用私有复制构造函数与删除复制构造函数
- 当从函数参数中的临时值调用复制构造函数时
- 如果有一个模板构造函数只有一个泛型参数,为什么我必须有一个复制构造函数
- 为什么需要复制构造函数,在哪些情况下它们非常有用
- 使用仅使用一次的变量调用的复制构造函数.这可能是通过调用move构造函数进行编译器优化的情况吗
- 为什么类中的ostringstream类型的成员会导致";调用隐含删除复制构造函数";错误
- 复制构造函数、赋值运算符C++
- std::ofstream 作为类成员删除复制构造函数?
- 复制构造函数C++无法正确复制指针
- 关于复制构造函数的一个棘手问题
- 为什么调用复制构造函数而不是移动构造函数?
- 填充上编译器生成的复制构造函数之间的不一致
- C++ 对象指针数组的复制构造函数
- C++ 基本 CTOR 说明 - 为什么不调用赋值/复制构造函数
- 防止在复制构造函数中隐式调用基构造函数
- 为用户定义的类正确调用复制构造函数/赋值运算符
- 具有已删除移动和复制构造函数的类的就地构造
- 复制构造函数隐式转换问题
- 复制构造函数中的递归调用