需要一个示例,显示默认构造函数不会被继承

Pio*_*ycz 6 c++ inheritance default-constructor c++11 inherited-constructors

我知道默认构造函数不是继承的,如n3337中所述.

那里有一个例子:

struct B2 {
  B2(int = 13, int = 42);
};

struct D2 : B2 {
  using B2::B2;
};
Run Code Online (Sandbox Code Playgroud)

有很好的解释:

D2for 的继承构造函数的候选集B2

...
—B2(int = 13, int = 42)
—B2(int = 13)
—B2()
Run Code Online (Sandbox Code Playgroud)

最重要的是:

存在的构造函数集D2
—D2()隐式声明的默认构造函数,不是继承的

对我来说,这个例子没有显示出差异,从某种意义上说,即使这个构造函数是继承的 - 它的行为与隐式声明的默认构造函数没有区别.

我需要一个示例来说明可以轻松理解的方式的差异,比如说,熟悉C++ 03但想要学习C++ 11的观众.


[更新]
所有答案(包括我自己的答案)都是善良的" 如果继承了默认的c-tor,那么示例将编译/不编译 ".

我更喜欢答案,其中结果(可观察行为)与其他情况不同.

dyp*_*dyp 2

考虑:

struct foo
{
    foo() {}
    foo(int) {}
};

struct bar : foo
{
    using foo::foo;
};

int main()
{
    bar b;
}
Run Code Online (Sandbox Code Playgroud)

编译:由于bar没有用户声明的构造函数,因此将隐式声明默认构造函数。

struct foo
{
    foo() {}
    foo(int) {}
};

struct bar : foo
{
    using foo::foo;
    bar(double) {}
};

int main()
{
    bar b;
}
Run Code Online (Sandbox Code Playgroud)

这不能编译。默认构造函数不是继承的,也不是隐式声明的,因为有bar(double)构造函数。