注意: 这几乎是该条目的重复: Abstract classes and Pointers
我需要创建一个虚拟类 vector 。这里的想法是:
#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 的 vector 。
现在,如果我不使用 VirtualFoo vector ,而是使用 VirtualFoo* vector 并将指针推回到 ConcreteFoo 实例,那么似乎工作得很好。
只是,我不确定这是最干净的方法。更像是我没有想到任何其他方法来做到这一点。这样做可以吗?
最佳答案
指针为 std::vector<VirtualFoo*> cfoos;
的 vector 很好。您无法实例化抽象类,因此编译器无法实例化或专门化使用抽象类作为值的 vector 模板。用基类指针指向元素是可以的,这就是里氏替换原则( 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)) );
关于c++ - 虚拟类: are pointers the clean way to go?的 vector ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15471193/