我认为对象和对象集合的行为类似。因此,为了表示我所在的对象:
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()更改为虚拟。我可以将私人会员改为受保护。
答案 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;
};