【发布时间】:2019-03-04 18:02:09
【问题描述】:
我是 C++ 新手,从我到现在学到的知识是,当我们从派生类调用复制构造函数时,会调用基类的复制构造函数。假设我在 Base 类的私有区域中有一个复制构造函数。如何在不调用基类的复制构造函数的情况下调用派生类的复制构造函数? (在这段代码中,A 没有复制构造函数的实现,这是我想知道的)。
class NonCopyable
{
protected:
NonCopyable(){}
~NonCopyable(){}
private:
NonCopyable(const NonCopyable& nonCopyable);
NonCopyable& operator=(const NonCopyable& nonCopyable);
};
class A: public NonCopyable
{
};
【问题讨论】:
-
不,那是不可能的。复制总是包括复制基类。您可以考虑使用
NonCOpyable的引用成员变量,而不是从它派生。 -
技术上你可以。需要派生类型构造函数来调用 a 基类型构造函数。通常,复制构造函数会调用基类型的复制构造函数,因为它们的目标一致。但是您可以想象一个深奥的情况,派生类型可能会调用不同的基类型构造函数。尽管无法避免调用 some 基本构造函数。编辑:尽管您必须确定这是正确的做法。在大多数情况下,需要它只是表明您尝试实现的设计存在重大问题。
-
感谢您的回答。你能告诉我为什么有必要在 NonCopyable 类中实现默认的复制构造函数,以及为什么将其设为 Protected 的原因?
-
@ValeriGrishin 出于同样的原因,您制作任何东西
protected,您只希望允许派生类型执行此操作。至于为什么开发商做出这样的设计决定?你应该问他们。也许是为了避免对象切片。使用不清楚。编辑:这里的复制构造函数是private,而不是protected。因此,正如该类型的名称所暗示的那样,他们根本不希望您复制NonCopyable。 -
关于受保护的我会问不同的。如果我们将默认构造函数设置为受保护的,它会阻止从非派生类的人创建类型为 NonCopyable 的对象吗?
标签: c++ inheritance copy-constructor