首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >为什么我们不能声明一个std::vector<AbstractClass>呢?

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

Stack Overflow用户
提问于 2010-01-29 17:17:03
回答 6查看 52.9K关注 0票数 98

在C#中花了相当多的时间进行开发之后,我注意到,如果为了将其用作接口而声明一个抽象类,则无法实例化该抽象类的向量来存储子类的实例。

代码语言:javascript
复制
#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中,声明抽象类的向量的行会导致以下错误:

代码语言:javascript
复制
error C2259: 'IFunnyInterface' : cannot instantiate abstract class

我看到了一个明显的解决方法,那就是用以下代码替换IFunnyInterface:

代码语言:javascript
复制
class IFunnyInterface
{
public:
    virtual void IamFunny()
    {
        throw new std::exception("not implemented");
    }
};

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

感谢你阅读这篇文章!

安东尼

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2010-01-29 17:20:41

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

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

代码语言:javascript
复制
std::vector<IFunnyInterface*> ifVec;

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

票数 136
EN

Stack Overflow用户

发布于 2010-01-29 17:20:16

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

您的变通方法不会起作用,因为虚函数(这就是您首先想要抽象类的原因)只有在通过指针或引用调用时才起作用。你也不能创建引用的向量,所以这是你必须使用指针向量的第二个原因。

您应该意识到,C++和C#几乎没有什么共同之处。如果你打算学习C++,你应该认为它是从头开始的,并阅读一本很好的专门的C++教程,比如Koenig和Moo的Accelerated C++

票数 24
EN

Stack Overflow用户

发布于 2010-01-29 18:57:36

在这种情况下,我们甚至不能使用以下代码:

代码语言:javascript
复制
std::vector <IFunnyInterface*> funnyItems;

代码语言:javascript
复制
std::vector <std::tr1::shared_ptr<IFunnyInterface> > funnyItems;

因为FunnyImpl和IFunnyInterface之间不存在A关系,并且由于私有继承,FUnnyImpl和IFunnyInterface之间不存在隐式转换。

您应该按如下方式更新代码:

代码语言:javascript
复制
class IFunnyInterface
{
public:
    virtual void IamFunny()  = 0;
};

class FunnyImpl: public IFunnyInterface
{
public:
    virtual void IamFunny()
    {
        cout << "<INSERT JOKE HERE>";
    }
};
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2160920

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档