有没有办法在转换为 Child 时使用 dynamic_cast?

Is There a way to use dynamic_cast When Casting to a Child?

说我有这些 类:

struct Parent {};
struct Child : public Parent {
    void func() {}
};

现在说我想创建一个这样的函数:

void foo(Parent* arg) {
    auto child = dynamic_cast<Child*>(arg);

    if(child != nullptr) child->func();
}

但显然这显然会给我错误:

dynamic_cast: Parent is not a polymorphic type

所以我无法执行 dynamic_cast 步骤,有没有办法可以验证 arg 实际上是 run-time 处的 Child*

给你的 Parent class 一个虚函数。想到析构函数,有几个原因(比如通过基本 ptr 删除子项等)。

不,你不能。您可以在运行时获取有关对象的信息是使用 RTTI (Run Time Type Information) 实现的。对象的 RTTI 存储在其 class 的虚拟 table 中。

多态 class 的每个对象(即具有一个或多个虚函数的 class,或从多态 class 派生的 class)包含一个vptr,它是指向相应class的虚拟table的指针。非多态类型的对象没有 vptr 并且它的 class 没有虚拟的 table。因此,您不能在非多态类型上使用 dynamic_cast

因此,正如@lorro 所说,您应该向 Parent 添加一个虚函数,最简单的选择是添加一个虚析构函数(无论如何您都应该这样做):

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