2012-02-14 8 views
23

純粋な仮想メソッド(インタフェース)を持つ抽象基本クラスIBaseがあるとします。基本クラスをパラメータとする関数を参照して派生クラスを渡すことは可能ですか?

次に、基本クラスからCFoo,CFoo2を派生します。

そして私たちはIBaseの使い方を知っています。これらのケースで

Foo(IBase *input); 

通常のシナリオ は、このようなものです:

IBase *ptr = static_cast<IBase*>(new CFoo("abc")); 
Foo(ptr); 
delete ptr; 

しかし、ポインタ管理を回避するために優れているので、このようなシナリオで参照を使用する方法はありますか?

Fooがある
CFoo inst("abc"); 
Foo(inst); 

Foo(IBase &input); 
+2

はい、あなたの質問には理想的です。 – ildjarn

+28

はい。多型はポインタと参照の両方に作用します。キャストを止めてください。我々はハリウッドではない。 –

答えて

39

はい。 オブジェクトをアップキャストする必要はありません。派生型へのすべての参照/ポインタは、必要に応じて基本オブジェクト参照/ポインタに暗黙的に変換されます。だから、

IBase* ptr = new CFoo("abc"); // good 
CFoo* ptr2 = static_cast<CFoo*>(ptr); // good 
CFoo* ptr3 = ptr; // compile error 

CFoo instance("abc"); 
IBase& ref = instance; // good 
CFoo& ref2 = static_cast<CFoo&>(ref); // good 
CFoo& ref3 = ref; // compile error 

あなたの種類が多型であれば、あなたは、dynamic_castを使用して検討する必要がありますダウンキャストする必要があります。

+0

私の問題がどこにあるのか分かりました。コンパイルしていない 'Foo(CFoo(" abc "));'を使っていました。 – Coder

+3

@Coder:あなたが気づいていない場合は、 'Foo'をrvalueに渡していて、rvaluesが非constの左辺値の参照にバインドできない(つまり' Foo'が 'Foo' IBase const&input); '代わりに、コンパイル済みです)。 – ildjarn

0

オブジェクトをポインタと同じようにキャストすることができます。 charunsigned charに変換し、その他のさまざまな記号を変更するときにこれが一般的であったことを思い出します。

関連する問題