C++では、指定されたオブジェクトの静的型と動的型が異なる場合があります。
あなたの静的タイプは、そのvecが指す共有ポインタはAccount
です。
そのvecポイント内の共有ポインタがどのように変化するかの動的タイプ。あなたのケースでは、あなたはそれにBusinessaccount
を入れます。
メソッドにアクセスまたは呼び出したい場合は、静的型メソッドのみにアクセスできます。
スタティック型は、その行に型が含まれていることをコンパイラに証明したものです。
がよく分かる場合は、static_cast<Businessaccount*>(vec.at(0).get())->getx()
とすることができます。そうすることで、その場所のデータが実際にはBusinessaccount
であることを特定していることをコンパイラに知らせることになります。あなたが間違っていると、あなたのプログラムの動作は未定義です(あなたがクラッシュして幸運な場合)。
RTTI(実行時のタイプ情報)をに指定することもできます。特定のオブジェクトが特定のサブタイプ(場合によっては仮想メソッドがある場合)の場合は、を入力します。
Account* paccount = vec.at(0).get();
Businessaccount* pba = dynamic_cast<Businessaccount*>(paccount);
if (pba)
pba->getx();
上記チェックpaccount
は実際Businessaccount*
であり、そうである場合は、それにgetx
を呼び出す場合。そうでなければ、何もしません。
ダイナミックキャスティングは、オブジェクトを正しく使用するように設計していないことが多い記号です。インプリメンテーションのインターフェイスにドリルダウンする必要があります。これは、インターフェイスが十分に豊かではないことを意味します。
一部のスクリプトとバイトコードのコンパイル言語では、あなたは外出してgetx
を呼び出して、そのメソッドが存在しない場合はクラッシュ/例外/ etcをスローします。
代わりに(型システムを介して)あなたが主張しているものを使用することができます。次に、動的型チェックが必要な場合は、独自のハンドラを記述できます。
これはスライスされていませんが、もちろん、コンパイラは 'at()'から返されたポインタを直接派生クラスのメンバー関数にアクセスすることはできません – MikeMB
'Account'は' getx ) '? –
ポインタを介してメソッドを呼び出す典型的な方法は ' - >'演算子です。 'vect.at(0) - > getx();' –