存储抽象类型的对象

时间:2014-02-05 18:36:06

标签: c++

假设我有一个抽象类/接口:

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是一个具体的类,会有什么变化吗?

3 个答案:

答案 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

由于缩小:您需要使用某种类型的引用。