我如何一起使用组合和继承?

时间:2016-07-21 11:44:35

标签: c++ inheritance composition

我认为对象和对象集合的行为类似。因此,为了表示我所在的对象:

class A {
public:
    virtual void foo();
protected:
    int x;
};

为了表示对象的集合,我还有另一个类:

class Collection: public A {
    void foo(); //override base class function
private:
    vector<A*> aList;
}

这很好,但问题是Collection类将有一个我不需要的A :: x副本。我不希望类Collection继承数据成员。我如何实现这一目标?

注意:我无法编辑A&#34; A&#34;因为它来自图书馆。 更正:我无法更改A的接口。其余代码正在使用A.我可以修改实现。如果它已经不是虚拟的,我可以将A :: anyFunction()更改为虚拟。我可以将私人会员改为受保护。

1 个答案:

答案 0 :(得分:1)

您可以使用界面:

class AInterface {
public:
    virtual void foo() = 0;
};

然后

class A : public AInterface {
     /*...*/
};

class Collection : public AInterface {
     /*...*/
};

如果您无法编辑A,您仍然可以通过编写包装器来使用该界面:

class AWrapper : public AInterface {
    void foo() { a.foo(); }
private:
    A a;
};