81
struct A {};

struct B : A {};

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

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

给出:

不能 dynamic_cast 'a'('struct A*' 类型)到类型 'struct B*'(源类型不是多态的)

我怎样才能使A多态?我想安全地将它投射到 B.

(一种方法是添加一个虚拟虚函数,但有更好的方法吗?)

4

3 回答 3

123

您需要进行A多态,您可以通过添加virtual析构函数或任何虚函数来实现:

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

或者,在 C++11 之前,

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

请注意,如果您打算通过指向基的指针安全地对派生类型的实例调用 delete,则多态类型无论如何都应该具有虚拟析构函数。

于 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 回答