假设我有一个抽象类/接口:
class MyInterface {
public:
virtual void foo() = 0;
virtual ~MyInterface(){}
};
class MyImplemented : public MyInterface {
public:
virtual void foo(){ /*do something*/ };
}
我希望有一个可以存储MyInterface
个对象的向量,我打算存储MyImplemented
类的对象。
除了制作指向MyInterface
个对象的向量之外,还有其他方法吗?即。
std::vector<MyInterface*> myVector;
另外,如果MyInterface
是一个具体的类,会有什么变化吗?
答案 0 :(得分:3)
您可以使用智能指针代替内置指针(std :: unique_ptr),也可以使用boost :: any然后转换为实型
答案 1 :(得分:2)
只有一个改进,但基本上是相同的:你可以存储unique_ptr
而不是原始指针。
但从概念上讲,你必须使用指针,因为在这种情况下,它是处理多态的唯一方法。
然后
我想要一个可以存储MyInterface对象的向量,我打算存储MyImplemented类的对象。
如果您知道只存储MyImplemented
类型的对象,您也可以直接使用std::vector<MyImplemented>
。
答案 2 :(得分:0)
如果您只有MyImplemented,那么没有理由不能
std :: vector myVector;
使用该布局可以更轻松地进行内存分配,并且您可以获得一些性能提升,因为内存布局(可以)更加缓存友好。
这(但)暗示了接口和实现之间的一对一关系。在这种情况下,几乎不需要使用多态:它使您的代码更复杂。您还可以通过虚拟函数调用获得(小)性能。
这不会起作用:
std :: vector myVector; // SO BAD
由于缩小:您需要使用某种类型的引用。