用继承的构造函数初始化sisterclass

时间:2014-03-01 06:13:40

标签: inheritance c++11 constructor

我有一个由2个子类继承的基类。这个子类也继承了构造函数。但是,如果我尝试用类B的副本构造类A的实例,它将无法工作(编译错误)。

class base {
  int a_;
public:
  base(int x)
  : a_(x) {}

  base(base const& cpy)
  : a_(cpy.a_) {}
};

class A : public base {
public:
  using base::base;
};

class B : public base  {
public:
  using base::base;
};

int main() {
    A a(123);
    B b(a);

  return 0;
}

正如您所见here

但是,如果我插入一个带有base作为参数类的构造函数,它可以工作:

class A : public base  {
public:
  using base::base;

  A(base const& cpy)
  : base(cpy) {}
};

为基础插入构造函数不是问题。我的问题是为什么继承的构造函数不起作用。

2 个答案:

答案 0 :(得分:3)

复制构造函数(以及move和default)明确地从继承中排除。我认为他们希望避免隐含你所展示的那种反向切片行为,尽管在很多情况下它不是问题。

N3797§12.9/ 2:

  

对于除了没有参数的构造函数或具有单个参数的复制/移动构造函数之外的候选继承构造函数集中的每个非模板构造函数,构造函数隐式声明具有相同的构造函数特征,除非......

答案 1 :(得分:0)

如果基类在任何地方都进行了深层复制,那么它会从继承的类中获得相同的内容。 但是,如果我们开始执行默认复制ctors,则编译器将无法“自动化”它,因为您需要在所有类中为其编写特殊代码。

您的示例相当简单,但如果在派生类中有多个指针和变量,则会很困难。 也许这就是为什么它从一开始就不被允许的原因。