[问题] 关于类型转换

楼主: asdfg1597860 (Jay)   2020-08-03 22:24:00
开发平台(Platform): (Ex: Win10, Linux, ...)
win10
编译器(Ex: GCC, clang, VC++...)+目标环境(跟开发平台不同的话需列出)
vs2015
额外使用到的函数库(Library Used): (Ex: OpenGL, ...)
问题(Question):
dynamic_cast的使用
喂入的资料(Input):
预期的正确结果(Expected Output):
错误结果(Wrong Output):
程式码(Code):(请善用置底文网页, 记得排版,禁止使用图档)
Class Basic
{
Public :
Virtual int A() {return 0;}
}
Class Basic2
{
Public:
Virtual int B(){return 0;}
}
Class Derived : public Basic , public Basic2
{
int A() override;
int B() override;
}
Basic* pa = new Derived();
Basic2* pb = dynamic_cast<Basic2*>(pa);
补充说明(Supplement):
想请问各位前辈 这样使用dynamic_cast 是否错误
虽然在程式中可以执行,也没发生错误
但与我在网络上查到的用法有些不同
有疑问的点是pa 是 父类别指标 ,同样的pb也是父类别指标
如此一来就没有上对下的类型转换
再麻烦各位前辈排解我的疑惑
作者: LPH66 (-6.2598534e+18f)   2020-08-04 01:27:00
这个叫做 sidecast, 就是如你这样有个子类继承两个父类时其中一边的父类指标若指向这个子类物件则可以如此转成另一边的父类指标注意到这得要真的指向这子类物件才能转, 不然 dynamic_cast会失败 (回传 nullptr)
作者: Killercat (杀人猫™)   2020-08-04 15:40:00
补充两点 dynamic_cast没有阶层关系 纯粹就是看meta有没有该class当parent,这就衍生出第二点:没开RTTI会炸所以你这转法基本上没问题 然后通常RTTI默认是开启
作者: s4300026 (s4300026)   2020-08-04 16:55:00
这行为不是跟c#继承两个interface一样吗? dynamic_cast后要if判断是不是nullptr,确保转型成功
作者: HMKRL (HMKRL)   2020-08-04 18:16:00
用法没错 但要检查回传是不是null

Links booklink

Contact Us: admin [ a t ] ucptt.com