为什么我们不能声明std :: vector <AbstractClass>?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (87)

在C#中花了相当长的时间开发之后,我注意到如果为了将其用作接口而声明抽象类,则不能实例化此抽象类的向量来存储子类的实例。

#pragma once
#include <iostream>
#include <vector>

using namespace std;

class IFunnyInterface
{
public:
    virtual void IamFunny()  = 0;
};

class FunnyImpl: IFunnyInterface
{
public:
    virtual void IamFunny()
    {
        cout << "<INSERT JOKE HERE>";
    }
};

class FunnyContainer
{
private:
    std::vector <IFunnyInterface> funnyItems;
};

MS VS2005中声明抽象类向量的行会导致此错误:

error C2259: 'IFunnyInterface' : cannot instantiate abstract class

我看到一个明显的解决方法,即用以下代替IFunnyInterface:

class IFunnyInterface
{
public:
    virtual void IamFunny()
    {
        throw new std::exception("not implemented");
    }
};
提问于
用户回答回答于

你不能实例化抽象类,因此抽象类的向量无法工作。

但是,你可以使用指向抽象类的向量:

std::vector<IFunnyInterface*> ifVec;
用户回答回答于

你不能创建一个抽象类类型的向量,因为你不能创建一个抽象类的实例,并且C ++标准库容器像std :: vector存储值(即实例)。如果你想这样做,你将不得不创建一个指向抽象类类型的指针向量。

你的workround将无法工作,因为虚拟函数(这就是为什么你首先需要抽象类)只有在通过指针或引用调用时才起作用。你也不能创建引用向量,所以这是你必须使用一个指针向量的第二个原因。

所属标签

可能回答问题的人

  • 找虫虫

    6 粉丝0 提问3 回答
  • 朝夕熊博客

    1 粉丝2 提问3 回答
  • gulu丶咕噜

    0 粉丝1 提问3 回答
  • 女淘日记

    杭州吱吱吱科技 · 站长 (已认证)

    1 粉丝1 提问3 回答

扫码关注云+社区

领取腾讯云代金券