我知道默认构造函数不会被继承,如n3337中所述。
那里有一个例子:
struct B2 {
B2(int = 13, int = 42);
};
struct D2 : B2 {
using B2::B2;
};
有很好的解释:
D2
B2
中的候选继承构造函数集是... —B2(int = 13, int = 42) —B2(int = 13) —B2()
最重要的是:
D2
中的构造函数集是
—D2()
,隐式声明的默认构造函数,不是继承的
对我来说,这个例子没有显示出差异,从某种意义上说,即使这个构造函数是继承的 - 它的行为与隐式声明的默认构造函数没有区别。
我需要一个示例来说明易于理解的方式的差异,比如熟悉C ++ 03但希望学习C ++ 11的读者。
[UPDATE]
所有的答案(包括我自己的答案)都很友好" 如果继承了默认的c-tor,那么示例将编译/不编译"。
我更喜欢答案,其中结果(可观察行为)与其他情况不同。
答案 0 :(得分:3)
一个可能的区别:具有默认构造函数的类的多构造函数继承。例如:
struct A { A(int=0); };
struct B { B(double=3.14); };
struct C : A, B {
using A::A;
using B::B;
};
C c;
如果继承了默认构造函数,C
将继承A
和B
中的一个,从而导致歧义。
我无法想到多构造函数继承的用例,所以这可能不是您正在寻找的完美示例,但它确实存在。
答案 1 :(得分:2)
考虑:
struct foo
{
foo() {}
foo(int) {}
};
struct bar : foo
{
using foo::foo;
};
int main()
{
bar b;
}
这个编译:由于bar
没有用户声明的构造函数,因此将隐式声明默认构造函数。
struct foo
{
foo() {}
foo(int) {}
};
struct bar : foo
{
using foo::foo;
bar(double) {}
};
int main()
{
bar b;
}
这不编译。默认构造函数不是继承的,并且不会隐式声明,因为存在bar(double)
构造函数。
答案 2 :(得分:1)
以下是可以从继承的构造函数的以下特性生成的示例:
12.9继承施工人员
[...]
4)如此声明的构造函数具有与X中相应构造函数相同的访问权限。
所以我的建议是在base中使用受保护的默认构造函数:
class Base {
protected:
Base(int) {}
Base() = default;
};
如果派生了此构造函数,则无法实例化派生类,因为派生构造函数将具有受保护的访问权限。如果没有派生 - 那么默认隐式声明的构造函数具有公共访问权限:
struct Derived : Base {
using Base::Base;
};
int main() {
Derived d1{}; // not inherited, default constructor is public
Derived d2{1}; // not compiling since this c-tor is inherited, thus protected
}