在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");
}
};
这是一种可接受的解决方法吗? C++明智吗?如果没有,有没有像boost这样的第三方库可以帮助我解决这个问题?
感谢你阅读这篇文章!
安东尼
发布于 2010-01-29 17:20:41
您不能实例化抽象类,因此抽象类的向量不能工作。
但是,您可以使用指向抽象类的指针向量:
std::vector<IFunnyInterface*> ifVec;
这也允许你实际使用多态行为--即使类不是抽象的,按值存储也会导致object slicing的问题。
发布于 2010-01-29 17:20:16
您不能创建抽象类类型的向量,因为您不能创建抽象类的实例,并且像std::vector这样的C++标准库容器存储值(即实例)。如果你想这样做,你必须创建一个指向抽象类类型的指针向量。
您的变通方法不会起作用,因为虚函数(这就是您首先想要抽象类的原因)只有在通过指针或引用调用时才起作用。你也不能创建引用的向量,所以这是你必须使用指针向量的第二个原因。
您应该意识到,C++和C#几乎没有什么共同之处。如果你打算学习C++,你应该认为它是从头开始的,并阅读一本很好的专门的C++教程,比如Koenig和Moo的Accelerated C++。
发布于 2010-01-29 18:57:36
在这种情况下,我们甚至不能使用以下代码:
std::vector <IFunnyInterface*> funnyItems;
或
std::vector <std::tr1::shared_ptr<IFunnyInterface> > funnyItems;
因为FunnyImpl和IFunnyInterface之间不存在A关系,并且由于私有继承,FUnnyImpl和IFunnyInterface之间不存在隐式转换。
您应该按如下方式更新代码:
class IFunnyInterface
{
public:
virtual void IamFunny() = 0;
};
class FunnyImpl: public IFunnyInterface
{
public:
virtual void IamFunny()
{
cout << "<INSERT JOKE HERE>";
}
};
https://stackoverflow.com/questions/2160920
复制相似问题