【问题标题】:Dynamic_cast not needing to perform a run-time check? [duplicate]Dynamic_cast 不需要执行运行时检查? [复制]
【发布时间】:2013-06-20 06:00:28
【问题描述】:
引用 C++ Gotchas 中的第 45 项:
首先,dynamic_cast 不一定是动态的,因为它可能不是
执行运行时检查。从派生的执行 dynamic_cast 时
指向其公共基类之一的类指针(或引用) 否
需要运行时检查,因为编译器可以静态确定
演员会成功。当然,不需要任何类型的演员表
在这种情况下,因为从派生类转换为其公共基类
类是预定义的。
我认为上面的描述是通常使用 dynamic_cast 的地方(因此会进行运行时检查??)。
有人能解释一下上述引用和“典型”需要使用 dynamic_cast 之间的区别吗?这让我对何时需要使用 dynamic_cast 以及为什么不需要在上述场景中使用它感到困惑。
【问题讨论】:
标签:
c++
polymorphism
dynamic-cast
【解决方案1】:
dynamic_cast 主要用于downcast 和cross-cast。陷阱提到了向上。
具有结构 B1、B2、D:B1、B2:
- 上调:D* -> B1*, D* -> B2*
- 垂头丧气:D*
- 交叉转换:B1* B2*(如果您的最派生类是 D,则可以使用)。
【解决方案2】:
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)
}