繁体   English   中英

dynamic_cast与在父类中公开虚拟函数(C ++)

[英]dynamic_cast vs exposing virtual functions in parent class (C++)

我有一个父类“ base”和另一个从“ base”继承的类“ derived”。

“派生”具有1个方法cH1。

如果我这样做:

base* b = new derived();

我希望能够做到这一点:

b->cH1();

显然我不能,有两种解决方案:

  • 要么将cH1声明为基本的纯虚拟。
  • 或执行以下操作:

     dynamic_cast<derived*>(b)->cH1(); 

哪个是更好的做法?

如果cH1方法在语义上适用于base ,则使其成为base的方法。 否则,将cH1derived ,并使用dynamic_cast 我认为您的类的语义应该驱动您的选择。

例如,如果您有一个基类Vehicle以及派生类CarMotorbikeAircraft ,则类似TakeOff()的方法具有与Aircraft兼容的语义,但与CarMotorbike不兼容,因此您可能希望将TakeOff() Aircraft方法,而不是Vehicle方法。

首先,为了使用dynamic_castbase必须至少具有一个虚函数。

其次,使用dynamic_cast 通常是设计错误的标志。 如果derived确实是base的子代,则derived对象应该能够站在期望的base对象的任何位置,这通常意味着base具有虚拟功能(无论是否为纯虚拟),并且derived会覆盖部分或全部虚拟功能。他们。

但是,如果不知道cH1作用,就不可能推荐一种方法。

dynamic_cast更干净,更灵活,但速度较慢。

请记住,当您使用dynamic_cast检查返回的指针是否为NULL时。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM