我有一个父类“base”和另一个继承自“base”的类“derived”。
“derived”有1个方法cH1。
如果我这样做:
base* b = new derived();
我希望能够做到这一点:
b->cH1();
显然我不能并且有两种解决方案:
或者这样做:
dynamic_cast<derived*>(b)->cH1();
哪一个是更好的做法?
答案 0 :(得分:7)
如果cH1
方法在语义上适用于base
,请将其设为base
方法。
否则,请将cH1
留给derived
,然后使用dynamic_cast
。
我认为你的课程的语义应该是你的选择。
例如,如果您有基类Vehicle
和派生类Car
,Motorbike
和Aircraft
,则TakeOff()
之类的方法具有语义与Aircraft
兼容,但与Car
或Motorbike
不兼容,因此您可能需要TakeOff()
Aircraft
方法,而不是Vehicle
方法。
答案 1 :(得分:3)
首先,为了使用dynamic_cast
,base
必须至少有一个虚函数。
其次,使用dynamic_cast
通常是设计错误的标志。如果derived
确实是base
的孩子,那么derived
对象应该能够站在预期base
对象的任何位置,这通常意味着{{1}有虚拟函数,无论是纯虚函数还是非虚函数,base
都会覆盖部分或全部函数。
不知道derived
做了什么,但是不可能推荐一种方法。
答案 2 :(得分:2)
dynamic_cast
更干净,更灵活,但速度稍慢。
请记住,当您使用dynamic_cast
检查返回的指针是否为NULL时。