17

基本クラスA、クラスBはAから継承、テンプレートクラスであるクラスCはAから継承します。クラスDはCから継承します。関係は次のとおりです。

        A
       / \   
      B   C (template class)
           \
            D

DオブジェクトD1を使用してAオブジェクトO1を作成できます。次に、O1をタイプCオブジェクトC1に動的にキャストします。しかし、私はそれが失敗することに気づきます。私の質問は、なぜこのプロセスが失敗するのかということです。

次に、static_castを使用してDオブジェクトD1からCタイプのオブジェクトC2を作成し、C2がD2から正しい値を持っていることを確認しました。static_castを使用してDタイプからCタイプに変換することは常に成功していますか?

ありがとうございました!!!

4

2 に答える 2

16

Cはテンプレートであるため、型ではなく、キャスト (動的から静的) のターゲットとして使用することはできず、そこから派生することもできません。クラス テンプレートをインスタンス化する必要があります。結果のクラスはキャストで使用できます。つまり、次のように動作します。

struct A { };
template <typename T> struct C : A { };
struct D : C<int> { };

D d;
A& a = d;
C<int>& c = static_cast<C<int>&>(a); // or dynamic_cast, if `A` were polymorphic
于 2012-08-28T16:08:35.293 に答える
9

タイプ C オブジェクト C1 に。しかし、私はそれが失敗していることに気づきました。

はテンプレートなのでC、実際には「タイプ C」はありません。むしろC<int>orがありC<Foo>ます (テンプレート引数が 1 つあると仮定します)。テンプレートは、特殊化された場合にのみクラスになります。

したがって、D が特定のタイプの C から継承された場合:

 class D : public C<int>
 {
 };

dynamic_castまではできますがC<int>、とは言えませんC<float>

説明をわかりやすくするために、継承ツリーは実際には

         A
       / | \
C<float>... C<int> 
             | 
             D

したがって、C は D の親ではありませんが、C<int>(この例では) 親です。のインスタンスはC実行時に実際には存在しませんC<type>。実際に存在するのは、完全に指定された のインスタンスのみです。

于 2012-08-28T16:10:07.667 に答える