作者asdfg1597860 (Jay)
看板C_and_CPP
标题[问题] 关於类型转换
时间Mon Aug 3 22:24:00 2020
开发平台(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也是父类别指标
如此一来就没有上对下的类型转换
再麻烦各位前辈排解我的疑惑
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 114.40.199.201 (台湾)
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/C_and_CPP/M.1596464642.A.BFB.html
1F:推 LPH66: 这个叫做 sidecast, 就是如你这样有个子类继承两个父类时08/04 01:27
2F:→ LPH66: 其中一边的父类指标若指向这个子类物件则可以如此转成08/04 01:27
3F:→ LPH66: 另一边的父类指标08/04 01:27
4F:→ LPH66: 注意到这得要真的指向这子类物件才能转, 不然 dynamic_cast08/04 01:29
5F:→ LPH66: 会失败 (回传 nullptr)08/04 01:29
6F:→ Killercat: 补充两点 dynamic_cast没有阶层关系 纯粹就是看meta有08/04 15:40
7F:→ Killercat: 没有该class当parent,这就衍生出第二点:没开RTTI会炸08/04 15:40
8F:→ Killercat: 所以你这转法基本上没问题 然後通常RTTI预设是开启08/04 15:41
9F:推 s4300026: 这行为不是跟c#继承两个interface一样吗? dynamic_cast08/04 16:55
10F:→ s4300026: 後要if判断是不是nullptr,确保转型成功08/04 16:55
11F:推 HMKRL: 用法没错 但要检查回传是不是null08/04 18:16
谢谢各位前辈解惑 後续我会加上判断
※ 编辑: asdfg1597860 (42.74.49.3 台湾), 08/04/2020 23:34:03