【问题标题】:Having a subclass accept a reference to a parent in a constructor让子类在构造函数中接受对父级的引用
【发布时间】:2012-03-16 01:25:24
【问题描述】:

我有一个类层次结构,可以这样简单地说:

struct Parent {
    Parent() { }
    Parent(Parent& p, std::string s) { }

private:
    // I want this class to be non-copyable
    Parent(const Parent&);
};

struct Child : public Parent {
    Child() { }
    Child(Parent& p) : Parent(p, "hi") { }
};

当我尝试像这样创建两个实例时:

Child c1;
Child c2(c1);

我从 Clang 收到以下错误:

test.cpp:37:8: error: call to deleted constructor of 'Child'
        Child c2(c1);
              ^  ~~
test.cpp:30:8: note: function has been explicitly marked deleted here
struct Child : public Parent {
       ^
1 error generated.

我希望这个类是不可复制的,那么有没有办法调用 Parent& 重载而不是复制构造函数?我知道它为什么会这样,但我正在寻找一种解决方法。我想调用 Child(Parent& p) 而不必强制转换它。

我在 GCC 和 Visual Studio 中也收到此错误。虽然我不明白英特尔的编译器,但其他三个的一致行为似乎表明它是错误的,其他的都是正确的。

【问题讨论】:

  • 那么您是在寻求解决方法还是为什么它不起作用?
  • @ildjarn 我知道它为什么不起作用,我需要一个解决方法。抱歉,我将对其进行编辑以使其更清楚。
  • 在传递 cv 限定的 Child& 时,根本无法创建一个比复制构造函数具有更高重载优先级的构造函数。您需要进行强制转换、类型擦除、工厂函数而不是公共构造函数或静态多态。

标签: c++ copy-constructor class-hierarchy


【解决方案1】:

你说你不希望你的类是可复制的。

您还在问题中说您希望以下 sn-p 工作:

Child c1;
Child c2(c1);

这些要求是矛盾的。

【讨论】:

    【解决方案2】:

    您依赖于自动生成的 Child 的复制构造函数,同时使父级的复制构造函数无法访问。似乎正在发生的事情是 Child 的自动生成的复制构造函数正在尝试调用父级的复制构造函数,但它不能,因为它是私有的。

    如果您不想添加复制构造函数,看起来您需要将 c1 显式转换为父引用:

    Child c2(static_cast<Parent&>(c1));
    

    或为 Child 声明复制构造函数。

    除此之外,我认为没有解决方法。

    【讨论】:

    • 我知道这会解决它,但我不希望这个类是可复制的。
    • 您仍然可以将子复制构造函数设为私有且不提供任何定义。
    • @Collin :那么它只是一个链接器错误而不是编译器错误;不是真正的解决方案。
    • @Collin :这仍然需要演员才能工作;这对不首先声明复制构造函数没有任何改进。
    • 再次更新了答案以澄清它可以在不声明子级复制构造函数的情况下工作。
    猜你喜欢
    • 2010-12-06
    • 1970-01-01
    • 1970-01-01
    • 2021-05-08
    • 2018-02-28
    • 2018-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多