1. ホーム
  2. c++

[解決済み] dynamic_castを使おうとすると「source type is not polymorphic」と表示される。

2023-08-18 12:07:22

質問

struct A {};

struct B : A {};

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

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

を与える。

cannot dynamic_cast 'a' (of type 'struct A*') to type 'struct B*' (source type is not polymorphic)

どのようにすれば A をポリモーフィックにするにはどうしたらよいでしょうか? 安全にBにキャストしたいのですが。

(ダミーの仮想関数を追加するのも一つの手ですが、もっと良い方法はないでしょうか)

どのように解決するのですか?

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

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

または、C++11以前。

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

多相型は、基底へのポインタを介して派生型のインスタンスに対して安全にdeleteを呼び出すことを意図している場合、いずれにしても仮想デストラクタを持つべきであることに注意してください。