C ++中的继承有多昂贵或代价高昂

时间:2011-10-13 12:32:19

标签: c++ inheritance

  

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

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

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

4 个答案:

答案 0 :(得分:1)

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

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

class B
{
public:
    void X()
    {
        m_a.Y();
    }
private:
    A m_a;
}

答案 1 :(得分:0)

如果B从A公开继承,你就是说B 是A,也就是说无论你用A做什么,你都应该能够做到B.你不希望B中的所有A行为都可用,那么公共继承就不是了。

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

答案 2 :(得分:0)

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

void B::Foo()
{
   _a.Foo();
}

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

答案 3 :(得分:0)

回答关于继承成本如何的主要问题:关于性能,只要方法是非虚方法,方法调用在继承方法时并不昂贵。关于内存占用,继承也不比聚合昂贵,在这两种情况下,聚合成员的字段或继承的基类的字段将在内存中使用您编写的新类中定义的字段进行说明。 / p>

因此,正如其他人所指出的那样,您决定是否使用继承或聚合/组合不应基于任何绩效/成本度量,而应基于您是否真的需要is-a关系。