我有一个父类“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但不兼容的语义,因此您可能希望创建一个方法,而不是方法。CarMotorbikeTakeOff()AircraftVehicle
首先,为了使用dynamic_cast,base必须至少有一个虚函数。
其次,使用dynamic_cast通常是设计错误的标志。如果derived确实是 的子级base,那么derived对象应该能够站在base期望对象的任何位置,这通常意味着base具有虚函数,无论是否纯虚函数,并且derived覆盖其中的部分或全部。
但是,如果不知道是什么cH1,就不可能推荐一种方法。
dynamic_cast更干净,更灵活,但速度有点慢。
请记住,当您使用dynamic_cast检查返回的指针是否为 NULL 时。