C++ 构造函数传递对基类对象的引用

c++ constructor pass a reference to a base class object

本文关键字:对象 引用 基类 构造函数 C++      更新时间:2023-10-16

我正在尝试理解复制构造函数。在下面的构造函数定义中,类DataModel派生自ComputationModel

我的问题是,当您将对基类的引用传递给派生类的构造函数时,这是一个复制构造函数吗?

为什么默认的复制构造函数在这里是不够的?

class DataModel : public ComputationModel {
public:
DataModel(const ComputationalModel &other);
//..
};
mv::DataModel::DataModel(const ComputationModel &other) :
ComputationModel(other)
{}

从技术上讲,您可以通过将ComputationalModel引用作为函数参数来定义DataModel的复制构造函数。

DataModel d1(/* Parameter... */);
ComputationModel c1(/* Parameter... */);
DataModel d2(d1); // copy-construct instance, d1 passed as refence to the base class
DataModel d3(c1); // same behavior

然而,这几乎不是一个好主意,因为对象的复制构造通常需要对象的状态。传递基类引用时,将删除派生类实例的所有数据成员,这将使新创建的对象处于难以从客户端代码中猜测的状态。

默认复制构造函数具有完全相同类型的 const 限定引用参数,在您的情况下:

DataModel(const DataModel& other) = default;

这让我想到了你的最后一个问题

为什么默认的复制构造函数在这里是不够的?

如果不看到继承层次结构的其余部分,就很难说出这一点。准则是:如果层次结构中所有数据成员的复制构造函数执行正确的操作,则默认的复制构造函数也执行正确的操作。