【问题标题】:Is it possible to use a copy constructor in Derived class without using Base copy constructor?是否可以在不使用 Base 复制构造函数的情况下在 Derived 类中使用复制构造函数?
【发布时间】: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


【解决方案1】:

简单的答案是:是的,这是可能的。

您只需要定义一个专用的 Derived 复制构造函数,它调用 NonCopyable 复制构造函数(当然,这在实际的软件应用程序中可能只是令人困惑,但这是一个不同的问题):

这个类是可构造的,但不是可复制构造的:

class CannotBeCopied: public NonCopyable {};

这个类是可构造的,也是可复制构造的:

class CanBeCopied: public NonCopyable {
public: 
    CanBeCopied() = default; // needed since otherwise CopyConstructor is only known construtor
    CanBeCopied(const CanBeCopied& b) { } // calls NonCopyable::NonCopyable() default-constructor, which is just protected
};

在此处查看生活示例: http://coliru.stacked-crooked.com/a/60c9fc42fa2dd59a

【讨论】:

    【解决方案2】:

    经过一番搜索,我找到了一种方法。有一种方法可以调用 Derived 类的复制构造函数,而无需调用 Base 类的复制构造函数。我们要做的就是在A中构建拷贝构造函数,A继承NonCopyable的构造函数,而拷贝构造函数是私有的:

    class NonCopyable
    {
    protected:
        NonCopyable(){}
        ~NonCopyable(){}
    private:
        NonCopyable(const NonCopyable& nonCopyable);
        NonCopyable& operator=(const NonCopyable& nonCopyable);
    };
    class A: public NonCopyable
    {
    public:
        A(){}
        A(const A& other){}
    };
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-05-02
      • 1970-01-01
      • 2021-02-08
      • 2014-03-24
      • 2014-02-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多