Dynamic_cast不需要执行运行时检查
Dynamic_cast not needing to perform a run-time check?
引用C++Gotchas:中的第45项
首先,dynamic_cast不一定是动态的,因为它可能不是执行运行时检查。从派生的执行dynamic_cast时指向其公共基类no之一的类指针(或引用)需要进行运行时检查,因为编译器可以静态地确定演员阵容一定会成功。当然,不需要任何类型的铸件在这种情况下,由于从派生类到其公共基的转换类是预定义的。
我认为上面的描述是dynamic_cast通常使用的地方(因此会进行运行时检查?)。
有人能解释一下上面的引用和使用dynamic_cast的"典型"需求之间的区别吗?这让我很困惑,我什么时候需要使用dynamic_cast,以及为什么在上面的场景中不需要使用它。
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)
}
dynamic_cast
主要用于下播和交叉播。gotcha提到了upcast。
具有结构B1、B2、D:B1、B2:
- 上行:D*->B1*,D*->B2*
- 下行:D*<-B1*、D*<-B2*
- 交叉铸造:B1*<->B2*(如果你最派生的类是D,则会起作用)
相关文章:
- 在运行时检查继承是否只有一种类型和 void*
- 运行时检查失败 #2 变量"A"周围的堆栈已损坏
- 运行时检查失败 #0 用于运行时重新编译
- 运行时检查失败 #2 - 变量"e"周围的堆栈已损坏。发生
- 运行时检查失败 #2 MSVC 仅使用 utf8proc 进行调试
- std::copy 导致运行时检查失败 #2
- 运行时检查失败 #2 - 变量周围的堆栈'...'已损坏
- 积分转换的运行时检查
- 运行时检查失败 #2 - 变量"l1"周围的堆栈已损坏
- C++:此代码可以编译,但引发运行时检查失败 #2 - 围绕变量周围的堆栈'num'已损坏。发生
- 运行时检查失败 - 变量周围的堆栈已损坏
- swscanf_s - 运行时检查错误
- 动态强制转换的运行时检查
- 运行时检查实例 (Base*) 是否覆盖父函数 (Base::f())
- 如何在 Linux 运行时检查堆栈使用情况?
- 调试:运行时检查失败 #2 - 变量"LoggerThread"周围的堆栈已损坏
- 运行时检查失败 #2 - 变量周围的堆栈'k'已损坏
- 运行时检查失败 #2 - 变量"数字选择"周围的堆栈已损坏
- 可以在编译时或运行时检查STD ::对齐的限制
- 如何避免对编译后无法访问的正在运行的代码部分进行运行时检查?