首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何同时使用组合和继承?

如何同时使用组合和继承?
EN

Stack Overflow用户
提问于 2016-07-21 19:44:35
回答 1查看 211关注 0票数 1

我有一个例子,其中一个对象和一个对象集合的行为相似。所以为了表示这个对象,我有一个类:

代码语言:javascript
运行
复制
class A {
public:
    virtual void foo();
protected:
    int x;
};

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

代码语言:javascript
运行
复制
class Collection: public A {
    void foo(); //override base class function
private:
    vector<A*> aList;
}

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

注意:我不能编辑"class A“,因为它来自一个库。更正:我无法更改A的接口。A在代码的其余部分中使用。我可以修改实现。如果A::anyFunction()已经不是虚拟的,我可以将它更改为虚拟的。我可以将私有成员更改为protected。

EN

回答 1

Stack Overflow用户

发布于 2016-07-21 19:48:39

您可以使用一个接口:

代码语言:javascript
运行
复制
class AInterface {
public:
    virtual void foo() = 0;
};

然后

代码语言:javascript
运行
复制
class A : public AInterface {
     /*...*/
};

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

如果你不能编辑A,你仍然可以通过编写一个包装器来使用这个接口:

代码语言:javascript
运行
复制
class AWrapper : public AInterface {
    void foo() { a.foo(); }
private:
    A a;
};
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38503395

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档