继承和成员函数

Inheritance and member functions

本文关键字:函数 成员 继承      更新时间:2023-10-16

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

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系列类,但它可以遵循一些一般模式(例如后处理),在A中添加post_process方法,在C1中覆盖它,并让方法调用C1的私有实现方法来完成实际的特定后处理任务。
  • 如果这两种情况都不是,你可能希望重新考虑你对继承的使用,因为你可能用它来表示一种关系而不是替代。

在基类a中添加虚函数会更好,因为:

  • 应该避免动态强制转换,特别是在性能敏感的代码中。请参阅dynamic_cast的性能?

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