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