C++ 在C++;

C++ 在C++;,c++,inheritance,C++,Inheritance,可能重复: 如果这个问题是重复的,我很抱歉。 我有一个C++类,比如A,它有一些方法,我只对其中一种方法感兴趣。我需要实现一个新的类B,它具有与a相同的数据成员。我不希望a的所有内容都包含在B中,只需要一个方法(或者可能是一对)。 B应该严格执行新的操作X,但不应该暴露a所做的任何事情 那么从A继承B有意义吗?这在内存占用、性能方面有多贵?如果我将一个方法从A复制到B,而不从A继承B,是否明智?我还有其他选择吗?如果B公开从A继承,你是说A B是A,也就是说,无论你能用A做什么,你都应该能用

可能重复:

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


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

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


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

如果B公开继承自a,您是说a B是a,也就是说,无论您对a做什么,您还应该能够使用B。如果您不希望a的所有行为都在B中可用,那么公共继承就不是一种可行的方法


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

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


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

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


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

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

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

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

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

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

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

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


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

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

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

请参阅