dynamic_cast
通常在我们有一个基类指针并想将其向下转换为派生类时使用。例如,
class A
{
public:
virtual void foo();
};
class B : public A
{
public:
void foo();
};
main()
{
A* a = new B();
B* b = dynamic_cast<B*> (a);
}
但是,使用C-style
cast 也可以实现同样的效果:
B* b = (B*)a;
那么,我的问题是在什么情况下/情况下完全有必要使用此运算符,即没有其他选择?
最佳答案
But, the same can also be accomplised by using C-style cast:
不,它不能:)
根据定义,C 风格转换将尝试执行一系列的const_cast
、static_cast
和reinterpret_cast
1 以实现您想要的转换,但不是 dynamic_cast
。所以,基本上,这里的 C 风格转换等同于 static_cast
,如果实际动态类型不匹配,它将具有未定义的行为(相反,在这种情况下,动态转换将返回 nullptr
在指针的情况下抛出 std::bad_cast
在引用的情况下)。
也就是说,如果您确定正在转换为正确的类型,那么使用static_cast
(或 C 风格的转换,但我个人认为不喜欢)。但是,如果您不确定,则使用 dynamic_cast
1 C-Style cast 也可用于转换为私有(private)基,这是前面提到的一系列 C++-Style casts 无法做到的
关于c++ - C++ 中 dynamic_cast 运算符的强制必要性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17597859/