Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/153.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 需要一个显示默认构造函数未被继承的示例吗_C++_Inheritance_C++11_Default Constructor_Inherited Constructors - Fatal编程技术网

C++ 需要一个显示默认构造函数未被继承的示例吗

C++ 需要一个显示默认构造函数未被继承的示例吗,c++,inheritance,c++11,default-constructor,inherited-constructors,C++,Inheritance,C++11,Default Constructor,Inherited Constructors,我知道默认构造函数不是继承的,如中所述 这里有一个例子: 结构B2{ B2(int=13,int=42); }; 结构D2:B2{ 使用B2::B2; }; 解释得很好: B2的D2中继承构造函数的候选集为 。。。 -B2(int=13,int=42) -B2(int=13) -B2() 最重要的是: D2中存在的构造函数集是 -D2(),隐式声明默认构造函数,未继承 对我来说,这个例子并没有显示出区别,从某种意义上说,即使这个构造函数是继承的——它的行为与隐式声明的默认构造函数没有区别 我

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

这里有一个例子:

结构B2{ B2(int=13,int=42); }; 结构D2:B2{ 使用B2::B2; }; 解释得很好:

B2
D2
中继承构造函数的候选集为

。。。
-B2(int=13,int=42)
-B2(int=13)
-B2()
最重要的是:

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

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

我需要一个例子来说明不同之处,让熟悉C++03但想学习C++11的观众很容易理解


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


我更喜欢结果(可观察到的行为)不同于其他情况的答案。

一个可能的区别:从具有默认构造函数的类继承多个构造函数。例如:

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
继承一个构造函数,从而导致歧义

我想不出一个多构造函数继承的用例,所以这可能不是您要寻找的完美示例,但它确实很有用。

考虑一下:

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)
构造函数。

下面是一个示例,可以通过继承构造函数的以下功能生成:

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
}
从提案(例如)来看,这似乎是(部分?)不继承复制/移动和默认CTOR的理由。