c++ - 为什么我们不能声明一个 std::vector<Abstract Class>?

标签 c++ stl abstract-class

在 C# 中花费了相当长的时间进行开发后,我注意到如果您声明一个抽象类是为了将其用作接口(interface),则您无法实例化该抽象类的 vector 来存储子类的实例。

#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;
};

声明抽象类 vector 的行在 MS VS2005 中导致此错误:

error C2259: 'IFunnyInterface' : cannot instantiate abstract class

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

class IFunnyInterface
{
public:
    virtual void IamFunny()
    {
        throw new std::exception("not implemented");
    }
};

这是 C++ 明智的可接受解决方法吗? 如果没有,是否有像 boost 这样的第三方库可以帮助我解决这个问题?

感谢您阅读本文!

安东尼

最佳答案

您无法实例化抽象类,因此抽象类的 vector 无法工作。

然而,您可以使用指向抽象类的指针 vector :

std::vector<IFunnyInterface*> ifVec;

这也允许您实际使用多态行为——即使类不是抽象的,按值存储也会导致 object slicing 的问题。 .

关于c++ - 为什么我们不能声明一个 std::vector<Abstract Class>?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46596400/

相关文章:

c++ - 为什么在 C++ 中的函数内创建对象是一种不好的做法?

c++ - 如何使用 std::accumulate 对单独定义的索引指向的 vector 中的值进行巧妙的求和(替换循环)

c++ - 哪个 STL 类用于 Rand-In-First-Out 缓冲区

java - UML 类图 - 扩展通用抽象类的表示法?

c++ - 使用继承来添加功能

c++ - 如何正确启动进程并转发 stdin/stdout/stderr?

c++ - 编译似乎不遵循不同 operator= 重载之间的正确路径

c++ - std::map 性能 c++

c++ - 保留 vector 是线程安全的吗?

c# - 抽象工厂模式