我有一个由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) {}
};
为基础插入构造函数不是问题。我的问题是为什么继承的构造函数不起作用。
答案 0 :(得分:3)
复制构造函数(以及move和default)明确地从继承中排除。我认为他们希望避免隐含你所展示的那种反向切片行为,尽管在很多情况下它不是问题。
N3797§12.9/ 2:
对于除了没有参数的构造函数或具有单个参数的复制/移动构造函数之外的候选继承构造函数集中的每个非模板构造函数,构造函数隐式声明具有相同的构造函数特征,除非......
答案 1 :(得分:0)
如果基类在任何地方都进行了深层复制,那么它会从继承的类中获得相同的内容。 但是,如果我们开始执行默认复制ctors,则编译器将无法“自动化”它,因为您需要在所有类中为其编写特殊代码。
您的示例相当简单,但如果在派生类中有多个指针和变量,则会很困难。 也许这就是为什么它从一开始就不被允许的原因。