C++中的继承有多昂贵

How expensive or costly is inheritance in C++

本文关键字:继承 C++      更新时间:2023-10-16

可能重复:
私有/受保护继承
遗产的成本是多少?

如果这个问题重复,我很抱歉。我有一个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关系。