6

n3337に記載されているように、デフォルトのコンストラクターが継承されていないことはわかっています。

そして、そこに例があります:

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

struct D2 : B2 {
  using B2::B2;
};

非常に良い説明で:

D2forの継承されたコンストラクターの候補セットは次のとおりB2です。

...
—B2(int = 13, int = 42)
—B2(int = 13)
—B2()

そして最も重要なこと:

に存在するコンストラクターのセットD2
—D2()、暗黙的に宣言されたデフォルトのコンストラクターであり、継承されていません

私にとって、この例は違いを示していません。つまり、このコンストラクターが継承されたとしても、その動作は暗黙的に宣言されたデフォルトのコンストラクターと変わらなかったということです。

たとえば、C++03 に精通しているが C++11 を学びたいと考えている聴衆にとって、簡単に理解できる方法の違いを示す例が必要です。


[更新]
すべての回答 (私自身のものを含む) は、「デフォルトの c-tor が継承された場合、例はコンパイルされる/コンパイルされない」という種類のものです。

結果(観察可能な動作)がそうでない場合とは異なる場合の回答を希望します。

4

3 に答える 3

3

考えられる違いの 1 つは、デフォルト コンストラクターを持つクラスからの複数コンストラクターの継承です。例えば:

struct A { A(int=0); };
struct B { B(double=3.14); };
struct C : A, B {
  using A::A;
  using B::B;
};

C c;

デフォルトのコンストラクターが継承された場合、はとのC両方から 1 つを継承するため、あいまいさが生じます。AB

複数のコンストラクターの継承のユースケースが思いつかないので、これはあなたが探している完璧な例ではないかもしれませんが、それは何かです.

于 2014-04-23T15:42:47.537 に答える
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)コンストラクターがあるため、暗黙的に宣言されません。

于 2014-04-23T16:38:21.137 に答える
1

継承されたコンストラクターの次の機能から生成できる例を次に示します。

12.9 コンストラクターの継承
[...]
4) そのように宣言されたコンストラクターは、X の対応するコンストラクターと同じアクセス権を持ちます。

したがって、私の提案は、ベースにデフォルトのコンストラクターを保護することです。

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
}
于 2014-04-23T19:38:13.323 に答える