考虑我有一系列派生类,例如如下所示:
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
中引入它并进行动态转换以访问它。哪一个更受欢迎?动态铸造太贵了吗? (我的主要约束是运行时。我在基类中有一个标志来指示它是什么类型的派生对象,因此我不必动态转换容器中的每个对象。是否会导致向基类添加不必要的函数在错误的指令缓存中使用?)
答案 0 :(得分:2)
您没有告诉我们C1
中新功能的用途,而确实会影响答案,但作为粗略的指导原则:
A
。C
类但,则可以遵循一些通用模式(例如后处理),添加post_process
方法A
,在C1
中覆盖它,并让 方法调用C1
的私有实现方法来执行实际的特定后处理任务。答案 1 :(得分:0)
向基类A添加虚函数更好,因为:
您应该避免使用动态强制转换,尤其是在性能敏感的代码中。请参阅Performance of dynamic_cast?
在执行特定于类型的操作之前,您应该避免检查对象类型(例如,A,B1还是C1?)的条件。不仅因为它很慢,而且因为如果你这样做,每次你添加一个新的对象类型(例如C2)时,你需要检查所有这些条件,看看它们是否需要更新。