C++中dynamic_cast强制转换运算符详解

在解释dynamic_cast的用法之前,我们先来探讨一下C++中的多态。

举一个例子,现在有三个class,分别为基类A,派生类B和C,BC分别重写了A中的show()方法,如果现在有一个函数example(),它需要接受一个B或则C的对象实例,然后在其内部调用实例的show()方法。则我们最好的方法就是example(A *a);然后不论我们传入B还是C的实例,他们会调用各自的show(),我们的程序就这样写,却可以根据传入的对象的不同而呈现不同的show的结果,这就是多态。(以前做JAVA的,感觉写的偏JAVA了……)在example方法中,我们使用基类指针a来接受派生类B或C的实例,这是实现多态的关键步骤之一。

则这里会有一个类似A* a=new B();的操作,所以我们就直接来讨论A* a=new B();吧。此处是用一个基类指针来指向派生类对象。根据C++的特性,当我们此时使用指针a来调用函数时,例如函数show(),分为两种情况:

1.show()为虚函数,即加有vitual修饰符,则编译器会根据指针指向的对象来运行show(),在此处为运行B类中的show();

2.show()不是vitual函数,则此时编译器会根据指针本身的类型来运行show(),即运行A类中的show()。

因此,a指针无法调用B类中的非虚方法,因为它会调用A类中的方法。还有另一种情况就是,B类可能含有A类所没有的方法,即B类扩展的方法。这些都是a指针无法调用的。

但是当我们想要通过a指针来调用B类中的非虚方法或是B类扩展的方法时,我们应该怎么办呢?

这就是dynamic_cast出现的意义所在。dynamic_cast能够将基类的指针cast为扩展类的指针,但前提是这个指针真正指向的实例为该扩展类实例。例如:

A* a=new B();

B* b=dynamic_cast<B*>(a);//这是可以的,前提是A类含有虚函数,即为多态类

而:

A* a=new A();

B* b=dynamic_cast<B*>(a);//这是不可以的,因为a指针实际指向的也是一个A实例


这样,我们就知道了如何正确的使用dynamic_cast来将指针进行转换,转化后就可以调用B类中的非虚方法或是B类扩展的方法了。


  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值