引用C ++ Gotchas中的第45项:
首先,dynamic_cast不一定是动态的,因为它可能不是动态的 执行运行时检查。从派生时执行dynamic_cast时 类指针(或引用)到其公共基类之一 需要运行时检查,因为编译器可以静态确定 演员会成功。当然,不需要任何类型的演员阵容 在这种情况下,从派生类转换到其公共基础 类是预定义的。
我认为上面的描述是通常使用dynamic_cast的地方(因此会进行运行时检查??)。
有人可以解释上述引用与使用dynamic_cast的“典型”需求之间的区别吗?这使我对何时需要使用dynamic_cast以及为什么我不需要在上述场景中使用它感到困惑。
答案 0 :(得分:4)
class Base {
public:
virtual ~Base() {}
// ...
};
class Derived : public Base {
// ...
};
“典型用途”:
void foo(Derived*);
void f(Base* pb)
{
if (Derived* pd = dynamic_cast<Derived*>(pb)) {
foo(pd);
}
}
“以上引用”:
void bar(Base*);
void f(Derived* pd)
{
Base* pb = dynamic_cast<Base*>(pd); // the dynamic_cast is useless here
// because a Derived IS-A Base, always
bar(pb); // Note: could as well call directly bar(pd); (implicit conversion)
}
答案 1 :(得分:2)
dynamic_cast
主要用于向下转换和交叉投射。陷阱提到了上流。
结构B1,B2,D:B1,B2: