0

我有以下课程:

(标题)

struct udtMapping
{
    int ByteStart;
    int ByteCount;
    int iHPUnitID;
};

class clsMapping : public CBaseStructure
{
private:
    vector<udtMapping> m_content;

protected:

public:
    vector<udtMapping> &Content();
    void Add(int i1, int i2, int int3);
};

cpp文件:

 vector<udtMapping> &clsMapping::Content()
 {
     return m_content;
 }
 void clsMapping::Add(int i1, int i2,int i3)
 {
     udtMapping n;
     n.ByteStart = i1;
     n.ByteCount = i2;
     n.iHPUnitID  = i3;
     m_content.push_back(n);    
     return;
 }

现在我想通过说来使用这个类

clsMapping nMapping;

但是编译器告诉我“不能从抽象类创建实例”。

我不确定我哪里出错了。感谢您的帮助。

编辑:根据要求,这里是 CBaseStructure

 class CBaseStructure 
 {
 protected:
     virtual void ProcessTxtLine(string line) = 0;
     virtual void AfterLoad();
     virtual string CompactLine(string line);
 public:
     void Load(string file);
     void Load2(string file);
     void Load3(string file);
 };
4

2 回答 2

3

CBaseStructure 必须是一个抽象类。如果你想从它派生并且你想要一个非抽象类,那么你必须重写 CBaseStructure 声明的每个纯虚函数。显然你没有这样做。

编辑

CBaseStructure 有一个纯虚函数ProcessTxtLine。您的班级必须覆盖该功能。

您的代码中没有任何内容可以解释您为什么要从 CBaseStructure 继承,您认为它将为您做什么?

于 2013-05-04T19:21:58.207 回答
0

查看您的CBaseStructure,请注意以下protected纯虚函数声明:

virtual void ProcessTxtLine(string line) = 0;

任何具有纯虚函数的类都是抽象类,而抽象类不能被实例化(想想为什么:它们没有任何代码来实现它们声称支持的某些功能)。

因此,抽象类是包含纯虚函数的类,基类需要派生类为其提供实现。

在您的情况下,您的clsMapping必须ProcessTxtLine.

那么如果你不这样做会发生什么?好吧,您的派生类“继承”了一个它不会覆盖的纯虚函数,因此它也变成了一个抽象类。正如我们已经建立的,抽象类不能被实例化。

于 2013-05-04T19:26:12.667 回答