81
struct A {};

struct B : A {};

int main()
{
    A* a = new B();

    B* b = dynamic_cast<B*>(a);
}

与えます:

'a' (型 'struct A*') を型 'struct B*' に dynamic_cast できません (ソース型は多態的ではありません)

どうすればAポリモーフィックにできますか? Bに安全にキャストしたい。

(ダミーの仮想関数を追加するのも一つの方法ですが、もっと良い方法はありますか?)

4

3 に答える 3

123

デストラクタまたは任意の仮想関数Aを追加することで、ポリモーフィックにする必要があります。virtual

struct A {
  virtual ~A() = default;
};

または、C++11 より前は、

struct A {
  virtual ~A() {}
};

ベースへのポインターを介して派生型のインスタンスで削除を安全に呼び出す場合は、ポリモーフィック型に仮想デストラクタが必要であることに注意してください。

于 2013-02-27T14:07:12.690 に答える
14

少なくともvirtual関数が必要です-通常、他に適切なものがない場合は、デストラクタ:

struct A {
   virtual ~A() {}
}; 
于 2013-02-27T14:07:09.987 に答える
7

コンパイラが言うように、型Aは多態的ではありません。virtualそれに機能を追加する必要があります。たとえば、virtualデストラクタが適切な選択になる可能性があります。

struct A { virtual ~A() { } };
//         ^^^^^^^ This makes A a polymorphic type

struct B : A {};

int main()
{
    A* a = new B();

    B* b = dynamic_cast<B*>(a); // Should work now
}
于 2013-02-27T14:07:20.623 に答える