[英]C++ virtual inheritance, virtual destructors, and dynamic_cast<void*>
[英]dynamic_cast vs exposing virtual functions in parent class (C++)
我有一个父类“ base”和另一个从“ base”继承的类“ derived”。
“派生”具有1个方法cH1。
如果我这样做:
base* b = new derived();
我希望能够做到这一点:
b->cH1();
显然我不能,有两种解决方案:
或执行以下操作:
dynamic_cast<derived*>(b)->cH1();
哪个是更好的做法?
如果cH1
方法在语义上适用于base
,则使其成为base
的方法。 否则,将cH1
为derived
,并使用dynamic_cast
。 我认为您的类的语义应该驱动您的选择。
例如,如果您有一个基类Vehicle
以及派生类Car
, Motorbike
和Aircraft
,则类似TakeOff()
的方法具有与Aircraft
兼容的语义,但与Car
或Motorbike
不兼容,因此您可能希望将TakeOff()
Aircraft
方法,而不是Vehicle
方法。
首先,为了使用dynamic_cast
, base
必须至少具有一个虚函数。
其次,使用dynamic_cast
通常是设计错误的标志。 如果derived
确实是base
的子代,则derived
对象应该能够站在期望的base
对象的任何位置,这通常意味着base
具有虚拟功能(无论是否为纯虚拟),并且derived
会覆盖部分或全部虚拟功能。他们。
但是,如果不知道cH1
作用,就不可能推荐一种方法。
dynamic_cast
更干净,更灵活,但速度较慢。
请记住,当您使用dynamic_cast
检查返回的指针是否为NULL时。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.