调用基类的复制构造函数,同时通过复制派生类的另一个对象来创建派生类的对象
Calling copy constructor of base class while creating object of derive class by copying another object of derive class
class base {};
class der : public base{};
der d1;
der d2(d1);
此语句调用类基的默认构造函数,然后复制 claas der 的构造函数。我的问题是为什么C++没有提供调用基类的复制构造函数的功能,同时通过复制派生类的另一个对象来创建派生类的对象
简短版本
此语句调用类基的默认构造函数,然后复制 claas der 的构造函数。
不,它没有。
我的问题是为什么C++没有提供调用基类的复制构造函数的功能,同时通过复制派生类的另一个对象来创建派生类的对象
确实如此。
长(呃(版
我不知道您是如何得出在构造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
此语句调用类基的默认构造函数,然后复制 claas der 的构造函数。
不,它没有。
第一行调用类der
的默认构造,调用类base
的默认构造函数。第二行调用类 der
的复制构造函数,因为您要将一个der
实例复制到另一个实例。
编译器生成的复制构造函数将调用基类的复制构造函数。
您可能已经为 der
添加了用户定义的复制构造函数。在这种情况下,必须显式调用基类的复制构造函数。
der::der(const der& other): base(other), ... {}
派生类的复制构造函数调用基类的默认构造函数。
下面的示例程序演示了相同的内容。
#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;
}
相关文章:
- 基类的填充将被复制到派生类中
- 通过基类接受方法转发派生 UniquePtr 的右值会移动引用而不是复制
- 如何复制只引用基类的派生类
- 为什么为派生类定义复制构造函数需要定义基类的默认构造函数?
- 将shared_ptr的向量复制到抽象基的派生类
- 为什么基类中的复制和交换会导致派生类中的复制赋值运算符被隐式删除?
- 有没有办法复制派生类指针的向量而不将其强制转换为基类?
- 从不可复制派生 AbstractBaseClasses (ABC) 是否有缺点?
- 是否可以在引用另一个派生类的派生类中声明复制构造函数?
- 在派生类中使用基类复制 CTOR
- 复制从抽象类派生的对象
- 派生类的复制构造函数
- 复制派生类更改基类的构造函数
- 复制派生类的分配运算符
- 将unique_ptr的内容复制到未知派生类
- 如何调用所有基本类的复制构造函数,以在C 中复制钻石继承中最派生的类对象
- 如何避免在派生类操作中复制
- 当派生类的基类具有成员指针时,对其进行深层复制
- 在派生类之间复制共享变量(浅副本就足够了)
- 如何从派生的类复制构造函数中调用复制构造函数