为什么要使用dynamic_cast

Posted stephen-qin

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为什么要使用dynamic_cast相关的知识,希望对你有一定的参考价值。

1.dynamic_cast为什么要使用?
因为能够 安全地 将基类指针或引用转换为派生类的。
为何这样说呢?
因为如果被绑定的指针不是目标类型的话说dynamic_cast会失败,对于指针类型的转换,最佳实践是在条件中去执行,这样可以保证转换和结果测试在一个表达式中进行,从而不可能在测试转换前不经意地使用派生类指针。

举例:

if (Derived *pDerived = dynamic_cast<Derived *>pBase) //能够转换成功,说明pBase指向的是Derived类型的对象
{
    //使用pDerived指向的派生类对象
}
else//pBase指向的是Base类型的对象
{
    //使用pBase指向的基类对象
}

 

 2.什么时候可以使用dynamic_cast来代替虚函数?

技术图片

 

3.dynamic_cast使用的场景:

如果你必须做一个非多态的工作在继承类B和C上,但只能接收基类A,则需要如下的操作:

class A { public: virtual ~A(){} };

class B: public A
{ public: void work4B(){} };

class C: public A
{ public: void work4C(){} };

void non_polymorphic_work(A* ap)
{
  if (B* bp =dynamic_cast<B*>(ap))
    bp->work4B(); 
  if (C* cp =dynamic_cast<C*>(ap))
    cp->work4C(); 
}

 

以上是关于为什么要使用dynamic_cast的主要内容,如果未能解决你的问题,请参考以下文章

为啥受保护的继承会导致 dynamic_cast 失败?

什么可能导致 dynamic_cast 崩溃?

c++ 中的 dynamic_cast 有啥替代方法吗?

为啥我在使用 memset 用零填充对象后在 dynamic_cast 出现异常

为啥虚函数调用比dynamic_cast快?

dynamic_cast用法