C ++中的继承有多昂贵或昂贵[重复]

Posted

技术标签:

【中文标题】C ++中的继承有多昂贵或昂贵[重复]【英文标题】:How expensive or costly is inheritance in C++ [duplicate] 【发布时间】:2011-12-06 22:30:34 【问题描述】:

可能重复:Private/protected inheritanceWhat is the cost of inheritance?

如果这个问题是重复的,我很抱歉。 我有一个 C++ 类说 A,它有一些方法,其中我只对一种方法感兴趣。我需要实现一个新的 B 类,它具有与 A 相同的数据成员。我不想要 B 中的 A 的所有内容,而是一个方法(或者可能是一对)。 B 应该严格执行新的操作 X ,但不应该暴露 A 一直在做的任何事情。

那么从 A 继承 B 有意义吗?这在内存占用和性能方面有多昂贵?如果我将一种方法从 A 复制到 B 而不从 A 继承 B 是否明智?我还有什么其他选择?

【问题讨论】:

见***.com/questions/374399/… 【参考方案1】:

OO 设计中的一个常见误解是,在大多数情况下,继承是正常的或好事。当您需要覆盖基类的某些操作但保持相同的接口时,继承是很好的。

看看其他可能更适合您并仍然可以重用代码的设计模式、组合等。

class B

public:
    void X()
    
        m_a.Y();
    
private:
    A m_a;

【讨论】:

【参考方案2】:

如果 B 从 A 公开继承,你是说 B 一个 A,也就是说,无论你可以用 A 做什么,你也应该可以用 B 做。如果您不希望 A 的所有行为都在 B 中可用,那么公共继承不是可行的方法。

您很可能需要一个简单的包含关系,其中 B 包含或引用 A 并调用重用的成员函数(它们在 C++ 中不称为方法)。

【讨论】:

【参考方案3】:

也许替代方案是组合。继承是解释关系“是一个”的好方法。如果我很好理解,您只需要一种方法(更准确地说,该方法的主体)。所以也许你的问题的解决方案是 B 类包含 A 类的实例,并且在调用方法 B::Foo() 之后在内部,然后

void B::Foo()

   _a.Foo();

在这种情况下继承不是很好的解决方案。

【讨论】:

【参考方案4】:

要回答您关于继承成本有多大的主要问题:就性能而言,只要方法是非虚拟的,当方法被继承时,方法调用的成本并不高。关于内存占用,继承也不比聚合更昂贵,在这两种情况下,聚合成员的字段或继承的基类的字段将与您编写的新类中定义的字段一起在内存中放置。

因此,正如其他人所指出的,您决定是使用继承还是聚合/组合不应基于任何性能/成本衡量标准,而应取决于您是否真的需要 is-a 关系。

【讨论】:

以上是关于C ++中的继承有多昂贵或昂贵[重复]的主要内容,如果未能解决你的问题,请参考以下文章

C ++ - 定义 - 私有继承[重复]

私有继承导致c ++中的问题[重复]

在C中的while循环或for循环之后没有代码执行[重复]

C ++编译器错误中的简单类继承[重复]

变量的Qt/C++继承[重复]

如何在 C 或 C++ 中以 O(n) 删除数组中的重复元素?