假设我有一个接口IControllable
,3个类继承了这个接口:MachineControllable, LightControllable, OtherControllable
,它有一些特定的数据和方法。
现在我只想拥有一个包含所有IControllable
的容器,所以我创建了一个向量容器。
vector<IControllable> allControllables; // and put all the MachineControllable,
//LightControllable, OtherControllable here by the IControllable interface class.
但现在的问题是,我只能使用IControllable
定义的内容,而不能使用特定数据和方法的特定可控性。
我是否应该为每个可控对象设置单独的容器,或者我的逻辑在OOP方面是如何错误的?
发布于 2015-06-08 00:29:16
“我是不是应该为每个可控制的对象都有单独的容器,或者我的逻辑在OOP方面是多么的错误?”
不,你的逻辑是正确的。问题是,你不能实例化一个抽象类。
您应该有一个容器来保存指向IControllable
接口的指针,例如:
vector<IControllable*> allControllables;
或
vector<std::unique_ptr<IControllable>> allControllables;
或
vector<std::shared_ptr<IControllable>> allControllables;
发布于 2015-06-08 00:39:16
如前所述,向量应该包含某种类型的指针,而不是基对象本身。
一旦有了它,您就需要一种方法来获取指向容器中实际对象类型的特定指针。标准方法是使用dynamic_cast
IMachineControllable * p = dynamic_cast<IMachineControllable*>(allControllables[i]);
如果你选择了错误的类型,你会得到一个空指针。
如果这些是Microsoft COM接口,您需要使用另一种方法,但我不会深入讨论,除非您声明这就是您所拥有的。
发布于 2015-06-08 00:37:50
这可能不是唯一的问题。容器需要值语义,并包含您放入其中的对象的副本。继承通常不能很好地处理复制和赋值:想一想,如果你有:
*p = *q;
其中p
和q
为IControllable*
,但p
指向MachineControllabe
,而q
指向LightControllable
。作为一般规则(也有例外),您应该使接口不可复制和不可分配。而且,通常情况下,它们还包含纯虚函数,这意味着您不能实例化它们。在任何一种情况下,std::vector<IControllable>
都不会编译。
您可能需要的是std::vector<IControllable*>
。多态性只能通过指针或引用工作(而且你不能有引用的向量)。
https://stackoverflow.com/questions/30695839
复制相似问题