继承和成员函数
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
系列类,但它可以遵循一些一般模式(例如后处理),在A
中添加post_process
方法,在C1
中覆盖它,并让该方法调用C1
的私有实现方法来完成实际的特定后处理任务。 - 如果这两种情况都不是,你可能希望重新考虑你对继承的使用,因为你可能用它来表示一种关系而不是替代。
在基类a中添加虚函数会更好,因为:
-
应该避免动态强制转换,特别是在性能敏感的代码中。请参阅dynamic_cast的性能?
-
在执行特定类型的操作之前,应该避免使用检查对象类型的条件(例如,它是A、B1还是C1 ?)不仅因为它很慢,还因为如果这样做,每次添加新对象类型(例如C2)时,都需要检查所有这些条件,以查看它们是否需要更新。
相关文章:
- 如何使用指针传递给函数的数组中对象的函数成员
- c++构造函数成员初始化:传递参数
- 创建 std::函数,它返回具有函数成员值的变量.分段错误
- 如何在C++通过公共函数访问私有函数成员?
- 解释了构造函数成员初始化列表
- 调用std::函数成员时内存损坏
- 是否可以为模板类的模板函数成员设置别名?
- 捕获 lambda 函数C++成员变量
- 构造函数成员初始值设定项跨成员列出,安全吗?
- 获取与在模板参数中传递的函数成员类型相同的类
- 如何从公共函数成员访问地图私有成员
- C 构造函数成员分配优化
- 使用命名空间进行函数成员定义
- 函数成员作为 CUDA 内核的参数
- 模板基类函数成员的别名
- 函数成员中用于void和继承的enable_if
- 头文件中是否定义了一个很长的Class函数成员
- 类内/构造函数成员初始化
- 使用指向部分专用函数成员的指针自动填充向量
- 指向函数成员的指针