为什么我们不能用抽象类创建容器?

Ani*_* Be 0 c++ containers templates

我试图创建抽象类的向量,但它给了我编译错误。代码是:

    class Base 
    {
    public :
        int _b; 
        virtual void virtualFunc() = 0;
    };

    int _tmain(int argc, _TCHAR* argv[])
    {
        std::vector<Base> vec;
    }
Run Code Online (Sandbox Code Playgroud)

我得到的编译错误是:

error C2259: 'B' : cannot instantiate abstract class due to following members:
'void B::virtualFunc(void)' : is abstract
Run Code Online (Sandbox Code Playgroud)

1)我不明白为什么我会出错是因为向量会尝试调用构造函数吗?通过值传递有什么用吗?2) 模板函数的行为也一样吗?

Jer*_*ner 5

1)我不明白为什么我会出错是因为向量会尝试调用构造函数吗?

是的 - 在内部向量需要分配一个对象数组来保存您的数据,即它会尝试执行以下操作:

this->dataItems = new Base[10];
Run Code Online (Sandbox Code Playgroud)

...但它不能这样做,因为 Base 是一个抽象类,因此可能无法直接实例化(在数组中或其他任何地方)。因此错误。

通过值传递有什么用吗?

不是直接的,但是如果您的目标是拥有一个对象的向量,这些对象是 Base 的各种子类,那么您可能想要使用:

std::vector< std::shared_ptr<Base> > vec;
Run Code Online (Sandbox Code Playgroud)

... 反而。然后你可以做例如:

vec.push_back(new Derived1());  // where Derived1 is a subclass of Base
vec.push_back(new Derived2());  // where Derived2 is another subclass of Base
vec[0]->virtualFunc();   // calls Derived1::virtualFunc()
vec[1]->virtualFunc();   // calls Derived2::virtualFunc()
Run Code Online (Sandbox Code Playgroud)

这将起作用,因为向量的内部数组只是一个智能指针数组(它们是非抽象的并且都是相同的类型)。