4

这是问题所在:尝试编译时,我不断收到未实现的纯虚拟方法错误。我已经在抽象基类中实现了所有纯虚方法。有任何想法吗?

这是抽象基类:

class record{
public:
    virtual int getID()=0;
    virtual record *clone(); 
};

和实施:

class sdata: public record{
public:
    sdata(std::string s = ""){data=s; ID=atoi(data.substr(0,8).c_str());}
    virtual int getID(){return ID;}
private:
    std::string data;
    int ID;
};

抱歉,这是完整的错误信息:

“记录”中未实现的纯虚拟方法“getID”

也许这段代码会导致错误:

int hashTable::hash(record *x) {
   return floor(m * (x->getID() * A - floor(x->getID() * A)));
}
4

2 回答 2

4

如果没有看到导致错误的代码,就很难确切地知道发生了什么。如果这是一个编译时错误,我在这里看不到任何会导致它的东西。

但是,如果您看到运行时错误,我能想到的两个最常见的原因是:

(1) 从基类的构造函数或析构函数中调用成员函数(甚至间接调用)。

(2) 派生类调用基类的函数版本,但未实现。

显示这两个错误的示例是:

struct Base {
    Base()
    {
        call_foo(); // Oops, indirectly calls Base::foo() (Scenario 1)
    }
    void call_foo() const {
        foo();
    }
protected:
    virtual void foo() const = 0;
};

struct Derived : Base { protected: virtual void foo() const { Base::foo(); // Oops, unimplemented virtual base function (Scenario 2) } };

int main() { Derived().call_foo(); }

== 更新:可能的编译时错误 ==

我在您的示例代码中观察到记录有一个非纯虚拟 clone() 成员函数返回一个record *. 由于记录是抽象的,您不能直接创建记录(只能创建它的具体子类)。这表明您的 clone() 成员函数也应该是纯虚拟的;如果它尝试(例如)return new record(),你会得到一个错误,你的基类有纯虚函数。

于 2013-04-03T01:19:03.490 回答
3

听起来您还没有实现抽象基类中的所有功能。如果您的基础中的函数具有签名:

    void SomeFuction() const;

您在派生类中实现以下内容:

    void SomeFuction();

那么您还没有实现该功能,因为您省略了const. GCC 应该告诉你你没有实现什么。

相关:如果你有一个基的具体实现,你会在派生类中隐藏它的名字。要查找您 [意外] 隐藏的功能,请使用-Woverloaded-virtual.

于 2013-04-03T01:04:39.413 回答