2011-09-14 17 views
3

私は以下の問題を抱えています:抽象的な基底クラスと基本クラスから実質的に継承する2つの抽象クラスがあり、結論としてはコンストラクタを呼び出す必要があります。必要な議論。抽象クラスのコンストラクタを使った仮想継承

しかし、私は2次クラスを継承する "普通の"クラスを持っています。そのため、ベースクラスコンストラクタを単独で呼び出す必要があります(基本クラスは実質的に2次クラスから継承されます)。 2番目のコンストラクタの両方が引数を取って基本クラスのコンストラクタに渡されます。

これらの場合、未使用の引数を渡す必要がないように、somhowでコンストラクタを実装することはできますか?

私は自分の問題を正確に記述することができたらいいと思っています。何か質問があれば、私はそれらに答えることができます。

+0

あなたはそれをうまく記述しようと思ったようですが、小さなコードサンプルを打つことができれば、より良い答えを出すために何をしているのか理解するのに役立ちます。 –

+1

'struct base {ベース(char a){}仮想func()= 0;}; struct derived1:パブリック仮想基底{derived1():base( 'a'){} func(){}}; struct derived2:public仮想ベース{derived2():base( 'b'){} func(){}};構造体derived3:public derived1、derived2 {derived3():derived1()、derived2()、base( 'c'){}}; '? –

+0

私は狂ったコードのコメントが好きです:) –

答えて

1

最後にが見つかりました。 MEM-初期化子で

§12.6.2/7 [class.base.init]

式リストまたはブレース-INIT-リストは、指定サブオブジェクト(又は、中を初期化するために 使用されます直接初期化のための 初期化規則に従って 委任コンストラクタ、完全なクラスオブジェクトの場合)各mem-initializerによって実行される の初期化は、完全表現 を構成します。 mem-initializer内の式は、初期化を実行する完全式の一部である と評価されます。 A mem-initializerここで、mem-initializer-idが仮想ベースを表す クラスは、 が最も派生したクラスでないクラスのコンストラクタの実行中は無視されます。

したがって、引数を渡します。彼らはとにかく無視されます。物事は本当にシンプルになります!

+0

うーん、大丈夫!それをしなくてはなりませんが、私は実際にそれを回避する方法があることを期待していましたので、短くて正確なコンストラクタを設計することができました。 – Sim

+0

派生クラスから使用するために、単に引数を取らない保護されたコンストラクタを作成することもできます。 –

+1

しかし、このコンストラクタを呼び出す状況が不可能であっても、なぜそれが必要なのかということは良い質問です。たとえば、抽象クラスのコンストラクタが仮想ベースを初期化する必要があるのはなぜですか(つまり、仮想ベースに引数を持つコンストラクタがある場合、この抽象クラスのデフォルトコンストラクタは合成できず、明示的に指定する必要があります)。派生クラスから呼び出された場合、それは呼び出されません。派生クラスが仮想ベース自体を初期化しなければならないからです。そうでなければ、クラスは抽象クラスなので呼び出されません。 – Ethouris

関連する問題