「親コンストラクタを継承する」とはどういう意味かは明確ではありません。オーバーライドという言葉を使用します。これは、多態的な仮想関数のように振る舞うコンストラクタについて考えているかもしれないことを示唆しています。「仮想コンストラクター」という用語はコードパターンの共通名なので、意図的に使用しません別のインスタンスを作成するためにオブジェクトの既存のインスタンスを実際に必要とする。
「仮想コンストラクター」パターン以外のポリモーフィックコンストラクターにはほとんど実用性がなく、実際のポリモーフィックコンストラクターを使用できる具体的なシナリオを見つけるのは困難です。リモートで有効なC ++でもない、非常に不自然な例:
struct Base {
virtual Base(unsigned p1, unsigned p2) {...}
};
struct Derived: public Base {
Derived(unsigned p1, unsigned p2) : Base(p1, p2) override {...}
};
int main(void) {
unsigned p1 = 0;
unsigned p2 = 42;
Derived *p_d1 = new Base(p1, p2); // This might call Derived(unsigned, unsigned).
Derived *p_d2 = nullptr;
p_d2 = new Base(p1, p2); // This might call Derived(unsigned, unsigned) too.
}
この場合、呼び出されるコンストラクターは、構築または割り当てられる変数の具象型に依存します。解析/コード生成中に検出するのは複雑であり、ユーティリティはありません。構築している具象型を知っていて、派生クラスの特定のコンストラクタを作成しました。次の有効な C ++コードはまったく同じで、わずかに短く、動作がより明確です。
struct Base {
Base(unsigned p1, unsigned p2) {...}
};
struct Derived: public Base {
Derived(unsigned p1, unsigned p2) : Base(p1, p2) {...}
};
int main(void) {
unsigned p1 = 0;
unsigned p2 = 42;
Derived *p_d1 = new Derived(p1, p2);
Derived *p_d2 = nullptr;
p_d2 = new Derived(p1, p2);
}
2番目の解釈またはおそらく追加の質問-明示的に非表示にしない限り、すべての派生クラスにBaseクラスコンストラクターが自動的に存在した場合はどうなりますか。
子が親コンストラクタを継承しない場合、何が問題になる可能性がありますか?
派生クラスの構築に使用するのが正しくない親コンストラクターを非表示にするには、追加のコードを記述する必要があります。これは、特定のパラメーターが無関係になるように、派生クラスが基本クラスを特殊化するときに発生する可能性があります。
典型的な例は長方形と正方形です(正方形と長方形は一般にリスコフ置換可能ではないため、あまり良い設計ではありませんが、問題を強調しています)。
struct Rectangle {
Rectangle(unsigned width, unsigned height) {...}
};
struct Square : public Rectangle {
explicit Square(unsigned side) : Rectangle(side, side) {...}
};
SquareがRectangleの2値コンストラクターを継承している場合、異なる高さと幅の正方形を構築できます...これは論理的に間違っているため、そのコンストラクターを非表示にする必要があります。