c++ - 动态转换不适用于非多态基类?

标签 c++ casting

这里第二个 Actor 给出了一个错误,说

cast.cc:35:35:错误:无法将“base”(类型为“class CBase*”)动态转换为类型“class CDerived*”(源类型不是多态的)

    CBase * base = new CDerived; 
    CBase* pb;
    CDerived * der = new CDerived; 
    CDerived* pd;
    pb = dynamic_cast<CBase*>(der);     // ok: derived-to-base
    pd = dynamic_cast<CDerived*>(base);  // wrong: base-to-derived

这是什么意思?

如果我使基类具有多态性,为什么会起作用?

有人可以告诉我这背后的基本概念吗?

最佳答案

因为标准是这么说的(请参阅 C++ 标准中的 [expr.dynamic.cast] 部分):

... dynamic_cast<T>(v)

... v shall be a pointer to or an lvalue of a polymorphic type

在实践中,因为run-time type information (RTTI)使动态向下转换(即从基础到派生)成为可能所需的与 vtbl/vptr mechanism 一起生成,如果没有多态成员函数,则不需要。

另一方面,向上转换(即派生到基础)不需要 RTTI(无需做出运行时决策)。引用标准的同一部分:

struct B { };
struct D : B { };
void foo(D* dp) {
    B* bp = dynamic_cast<B*>(dp); // equivalent to B* bp = dp;
}

关于c++ - 动态转换不适用于非多态基类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10524598/

相关文章:

c# - 对 "PostSharp complains about CA1800:DoNotCastUnnecessarily"的修复是最好的修复吗?

c++ - 使用 forrange 循环打印 argv

尽管格式有效,MySQL str_to_date 仍生成 NULL

database - postgres 将字符串插入数字列 - 不会发生自动类型转换

JavaScript 转换 - 为什么比较 "5"> "300"返回 true?

c++ - std::stoi bool 值的替代方案

c++ - 省略 for 循环值

c++ - 在 c++ () 或 {} 中委托(delegate)构造函数

c++ - 我可以通过此类的实例访问类的成员类型吗?

c++ - 如何在单例模式中初始化类成员?