繁体   English   中英

继承和成员函数

[英]Inheritance and member functions

考虑一下,我有一系列派生类,例如下面所列:

class A
{
...
}

class B1 : public A //there may be many B's here say, B2, B3 etc
{
 ...
}
class C1 : public B1 //may be more C's as well
{
...
}

我想将所有对象放在单个容器中,因此所有对象都是A类类型。

假设我想向C1类添加一个函数,实现此目的的最佳方法是什么? 我的选择是将其引入基类A并在C1编写所需的实现,或者,我可以将其引入C1并进行动态强制转换以对其进行访问。 首选哪一个? 动态铸造太昂贵了吗? (我的主要约束是运行时间。我在基类中有一个标志来指示它是什么类型的派生对象,因此不必动态转换容器中的每个对象。是否会在基类中添加不必要的功能在错误的指令缓存中使用?)

您没有告诉我们C1新功能的目的,但这确实会影响答案,但作为粗略的指导原则:

  • 如果新功能是您可能需要在任何对象上执行的常规操作,并且C1恰好是第一个用户,则肯定要将接口添加到A
  • 如果新函数特定于C系列类, 但是它可以遵循某些常规模式(例如,后处理),则将post_process方法添加到A ,在C1覆盖它,并使方法调用C1私有实现方法以完成实际的特定后处理任务。
  • 如果这两种情况都不是,则您可能希望重新考虑继承的使用,因为您可能会使用它来表示替代关系。

向基类A添加虚拟函数会更好,因为:

  • 您应该避免动态转换,尤其是在对性能敏感的代码中。 请查看dynamic_cast的性能?

  • 在执行特定于类型的操作之前,应避免有条件检查对象类型(例如,A,B1或C1吗?)。 不仅因为它很慢,而且还因为这样做,每次添加新的对象类型(例如C2)时,您都需要检查所有这些条件以查看是否需要更新。

暂无
暂无

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

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