2

このような派生クラスを実際に指している基本クラスのオブジェクトがあります

Base *b = new Derived()

私が知りたいのは、オブジェクトを派生クラスにキャストできる関数への参照によって、基本クラスのポインターを渡すことができるかどうかです。このようなもの

Dummy_cast_fn(&b) // casts b to derived class

を呼び出した後Dummy_cast_fnb派生クラスの完全なコピーが必要です (スライスなし)。

編集 ポインターが使用されているため、スライスがないという部分がわかりません。私の問題は、派生クラスが共有ライブラリへの関数呼び出しから返され、派生クラスの .h ファイルにアクセスできないことです。私が持っている唯一の情報は、Derived が Base クラスに基づいているということです。Base.h にアクセスできるので、Base のオブジェクトをインスタンス化できますが、Derived では定義されているが Base では定義されていない関数にアクセスしようとすると問題が発生します。したがって、Base を Derived 型に型キャストできるかどうか疑問に思っていました。その後、Base ではなく Derived で定義された関数にアクセスできるようになります。

4

3 に答える 3

3

bが へのポインタまたは参照である限り、Derivedいつでも次のことができます。

  1. にダウンキャストしDerivedます。
  2. Baseを使用している限り、 として扱いますb

つまり、何ができるかを決定するbのは、この場合は静的な型Baseです。ただし、実際には を指しているためDerived、いつでもダウンキャストできます。ただし、それを として使用するにはDerived、タイプが である変数も必要ですDerived

したがって、の目的Dummy_cast_fnが単に何かを修正することである場合、それは役に立ちませbん。オブジェクトがスライスされている場合、それを修正することはできません。しかし、あなたの場合、ポインタを使用しているため、スライスはありません。

質問の編集に従って編集します。

まず、あなたのDerivedオブジェクトはスライスされていません。それをテーブルから取り除こう。完全へのポインターがありますDerived(それが渡されたと仮定します) が、ポインターBaseを使用する場合にのみその部分にアクセスできBaseます。さて、あなたは の定義を持っていないと言いますDerived。これは、コンパイラがどのように定義されているかを知らないため、その型にダウンキャストできないことを意味します。ここではキャストは機能しません。の定義sumがない場合、その関数を呼び出すことができる正当な C++ の方法はありません。Derived

Derivedの作成者が、定義を提供せずにドキュメントを提供した理由が不思議です。この種のポリモーフィズムでは、プロバイダーは通常、ユーザーに何らかの「インターフェース」を持たせ、実際の型を内部実装の詳細として残します。定義がないために使用できない場合Derivedは、ドキュメントを用意しても意味がありません。

于 2012-07-03T06:54:47.233 に答える
2

Base*aをに変更することはできませんが、 :を使用して、aが指しているオブジェクトを指すようにするDerived*ことができます。Derived*Base*dynamic_cast

Derived* d = dynamic_cast<Derived*>(b);
if (d) {
  // cast was succesful
} else {
  // cast failed, 
  // e.g. because b* does not point to a Derived* but some other derived type
}
于 2012-07-03T06:49:57.367 に答える
2

タイプを変更することはできませんがBase* b、新しいポインタを作成することはできます

    Derived* p = static_cast<Derived*>(b); 

そしてそれを使用します。タイプを変更できないため、一度b宣言されます。Base*これは遅く、厳密には必要ないかもしれませんが、使用することもできますdynamic_cast(ただし、特定のことは言えませんが、要件によって異なります)。また、仮想関数を正しく使用している場合は、キャストをまったく行う必要がない場合もあります。これは、ポリモーフィズムの目的の1つです。

于 2012-07-03T06:52:37.423 に答える