C++中的继承有多昂贵
How expensive or costly is inheritance in C++
可能重复:
私有/受保护继承
遗产的成本是多少?
如果这个问题重复,我很抱歉。我有一个C++类,比如a,它有一些方法,其中我只对一个方法感兴趣。我需要实现一个新的类B,它拥有与a相同的数据成员。我不希望a的所有内容都在B中,只希望有一个方法(或者可能是一对(。B应该严格执行新的操作X,但不应该暴露a一直在做的任何事情。
那么从A继承B有意义吗?就内存占用和性能而言,这有多贵?如果我将一个方法从A复制到B,而不从A继承B,这是否明智?我还有什么其他选择?
OO设计中一个常见的误解是,在大多数情况下,继承是一件正常的或好的事情。当您需要重写基类的某些操作但保留相同的接口时,继承是很好的。
看看其他可能更适合您的设计模式、组合等,它们仍然可以重用代码。
class B
{
public:
void X()
{
m_a.Y();
}
private:
A m_a;
}
如果B从A公开继承,你就是说B就是A,也就是说,无论你能用A做什么,你都应该能用B做。如果你不想让A的所有行为都在B中可用,那么公开继承就不是办法。
最有可能的是,您想要一个简单的包含关系,即B包含或引用一个a,并调用重用的成员函数(它们在C++中不称为方法(。
也许另一种选择是组合。继承是解释关系"是一个"的好方法。如果我很理解,你只需要一个方法(更准确地说,就是那个方法的主体(。所以,也许问题的解决方案是,类B包含类A的实例,并在内部调用方法B::Foo((后,调用
void B::Foo()
{
_a.Foo();
}
在这种情况下,继承不是一个好的解决方案。
回答您关于继承成本有多高的主要问题:就性能而言,只要方法是非虚拟的,当方法被继承时,方法调用的成本不会更高。关于内存占用空间继承也不比聚合更昂贵,在这两种情况下,聚合成员的字段或继承基类的字段都将与您编写的新类中定义的字段一起放在内存中。
因此,正如其他人所指出的,您是否使用继承或聚合/组合的决定不应基于任何性能/成本度量,而应基于您是否真的需要is-a关系。
- 继承函数的重载解析
- 继承期间显示未知行为的子类
- 头文件-继承c++
- 为什么在保护模式下继承升级不起作用
- 通过继承类使用来自不同命名空间的运算符
- 子目录是否继承属性,例如add_definitions,include_directories和父Cmakelist.t
- 混合组合和继承的C++问题
- 继承:构造函数,初始化C++11中基类的类C数组成员
- 从类继承时,继承的类是否会通过父类重新定义继承的变量
- 公共与私人继承
- 如何创建从同一类继承的不同对象的向量
- 如何从另一个文件继承私有成员变量和公共函数
- 在模板基类中为继承类中的可选重写生成虚拟方法
- 带有继承的C++工厂
- 我应该避免多重实现继承吗
- C++继承更改成员
- 从具有默认值的部分指定模板类继承时发生SWIG错误,具有不带默认值的正向声明
- 关于C++中具有多重继承"this"指针的说明
- 尝试使用继承和模板实现CRTP.Visual Studio正在生成编译器错误
- 如何在QT Creator上将QWidget声明为继承类的对象