首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >C++继承,接口

C++继承,接口
EN

Stack Overflow用户
提问于 2015-06-08 00:26:37
回答 4查看 94关注 0票数 2

假设我有一个接口IControllable,3个类继承了这个接口:MachineControllable, LightControllable, OtherControllable,它有一些特定的数据和方法。

现在我只想拥有一个包含所有IControllable的容器,所以我创建了一个向量容器。

代码语言:javascript
运行
复制
vector<IControllable> allControllables; // and put all the MachineControllable,
//LightControllable, OtherControllable here by the IControllable interface class.

但现在的问题是,我只能使用IControllable定义的内容,而不能使用特定数据和方法的特定可控性。

我是否应该为每个可控对象设置单独的容器,或者我的逻辑在OOP方面是如何错误的?

EN

回答 4

Stack Overflow用户

发布于 2015-06-08 00:29:16

“我是不是应该为每个可控制的对象都有单独的容器,或者我的逻辑在OOP方面是多么的错误?”

不,你的逻辑是正确的。问题是,你不能实例化一个抽象类。

您应该有一个容器来保存指向IControllable接口的指针,例如:

代码语言:javascript
运行
复制
 vector<IControllable*> allControllables;

代码语言:javascript
运行
复制
 vector<std::unique_ptr<IControllable>> allControllables;

代码语言:javascript
运行
复制
 vector<std::shared_ptr<IControllable>> allControllables;
票数 4
EN

Stack Overflow用户

发布于 2015-06-08 00:39:16

如前所述,向量应该包含某种类型的指针,而不是基对象本身。

一旦有了它,您就需要一种方法来获取指向容器中实际对象类型的特定指针。标准方法是使用dynamic_cast

代码语言:javascript
运行
复制
IMachineControllable * p = dynamic_cast<IMachineControllable*>(allControllables[i]);

如果你选择了错误的类型,你会得到一个空指针。

如果这些是Microsoft COM接口,您需要使用另一种方法,但我不会深入讨论,除非您声明这就是您所拥有的。

票数 2
EN

Stack Overflow用户

发布于 2015-06-08 00:37:50

这可能不是唯一的问题。容器需要值语义,并包含您放入其中的对象的副本。继承通常不能很好地处理复制和赋值:想一想,如果你有:

代码语言:javascript
运行
复制
*p = *q;

其中pqIControllable*,但p指向MachineControllabe,而q指向LightControllable。作为一般规则(也有例外),您应该使接口不可复制和不可分配。而且,通常情况下,它们还包含纯虚函数,这意味着您不能实例化它们。在任何一种情况下,std::vector<IControllable>都不会编译。

您可能需要的是std::vector<IControllable*>。多态性只能通过指针或引用工作(而且你不能有引用的向量)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30695839

复制
相关文章

相似问题

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