虚拟类的向量:指针是干净的方法吗

Vector of virtual class : are pointers the clean way to go?

本文关键字:方法 指针 向量 虚拟      更新时间:2023-10-16

注意:这几乎是此条目的重复:抽象类和指针

我需要创建一个虚拟类的向量。这里的想法:

#include <vector>
using namespace std;
class VirtualFoo {
protected:
    VirtualFoo();
    virtual ~VirtualFoo();
public:
    virtual void doStuff()=0;
};
class ConcreteFoo: public VirtualFoo {
public:
    ConcreteFoo(double a);
    virtual ~ConcreteFoo();
    void doStuff();
private:
    double a;
};
class Foo {
public:
    Foo(std::vector<VirtualFoo> foos);
    virtual ~Foo();
    void doAllStuff();
protected:
    std::vector<VirtualFoo> foos;
};

我想这样使用它:

int main(int argc, char *argv[]){
    std::vector<ConcreteFoo> cfoos;
    cfoos.push_back(ConcreteFoo(1.0));
    cfoos.push_back(ConcreteFoo(2.0));
    Foo foo = Foo(cfoos);
    foo.doAllStuff();
}

当然,这不起作用,因为cfoos是VirtualFoo的向量,而不是ConcreteFoo。

现在,如果我不使用VirtualFoo的向量,而是使用VirtualFoo*的向量,并向后推指针到ConcreteFoo的实例,这似乎很好。

只是,我不确定这是最干净的方式。这更像是我没有想到任何其他方式来做这件事。这样做可以吗?

指针为std::vector<VirtualFoo*> cfoos;的向量很好。您无法实例化抽象类,因此编译器无法实例化或专门化使用抽象类作为值的向量模板。用基类指针指向元素是好的,这就是Liskov替换原理(http://en.wikipedia.org/wiki/Liskov_substitution_principle)

我同意其他人的意见,即共享指针是更好的解决方案,这样你就不必担心内存管理:

std::vector<shared_ptr<VirtualFoo>> cfoos;  
cfoos.push_back( shared_ptr<VirtualFoo> (new ConcreteFoo(1.0)) );   
cfoos.push_back( shared_ptr<VirtualFoo> (new ConcreteFoo(2.0)) );