继承和成员函数

时间:2016-08-29 17:32:50

标签: c++ c++11 inheritance polymorphism

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

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中引入它并进行动态转换以访问它。哪一个更受欢迎?动态铸造太贵了吗? (我的主要约束是运行时。我在基类中有一个标志来指示它是什么类型的派生对象,因此我不必动态转换容器中的每个对象。是否会导致向基类添加不必要的函数在错误的指令缓存中使用?)

2 个答案:

答案 0 :(得分:2)

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

  • 如果新功能是您在任何对象上可能需要的一般行为而C1恰好是第一个用户,那么只需将接口添加到A
  • 如果新功能特定于C,则可以遵循一些通用模式(例如后处理),添加post_process方法A,在C1中覆盖它,并让 方法调用C1的私有实现方法来执行实际的特定后处理任务。
  • 如果这些都不属于这种情况,您可能希望重新考虑使用继承,因为您可能会使用它来代表替代以外的关系。

答案 1 :(得分:0)

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

  • 您应该避免使用动态强制转换,尤其是在性能敏感的代码中。请参阅Performance of dynamic_cast?

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