未实现的纯虚函数?

6

问题如下:当我尝试编译时,我一直收到未实现纯虚方法的错误。我已经在抽象基类中实现了所有纯虚方法。有什么想法吗?

这是抽象基类:

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

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

在'record'中未实现纯虚拟方法'getID'

也许这段代码引起了错误:

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

7
除非看到相关的代码,否则无法确定。 - Oliver Charlesworth
不要忘记常量。但是,查看代码可能会有所帮助。 - Nbr44
2
类记录(class record)是否有 clone() 的实现?如果在层次结构中没有任何实现,您的编译器可能会将其视为纯虚函数。 - Chris Hayes
"unimplemented pure virtual method error" 是一个矛盾修辞法。你需要引用错误信息的确切文本。 - Hans Passant
1
你应该展示产生错误的代码。同时,在派生类中的getID声明中添加override关键字,看看会发生什么。 - Matt Phillips
显示剩余7条评论
2个回答

4

听起来你没有实现抽象基类中的所有函数。如果你的基类中有一个函数签名为:

    void SomeFuction() const;

你需要在派生类中实现以下内容:

    void SomeFuction();

你还没有实现该函数,因为你省略了 const。GCC应该会告诉你你没有实现什么。

相关:如果你有一个基类的具体实现,你应该在派生类中隐藏它的名称。要查找 [意外] 隐藏的函数,请使用 -Woverloaded-virtual


4
没有看到导致错误的代码,很难知道具体情况。如果这是编译时错误,我没有看到任何会导致它的内容。但是,如果您看到运行时错误,我能想到的两个最常见的原因是:(1) 在基类的构造函数或析构函数中(甚至间接地)从成员函数调用;(2) 派生类调用基类的函数版本而未实现它。一个同时显示这两个错误的示例如下:

struct Base {
    Base()
    {
        call_foo(); // 噢,间接地调用了Base::foo() (情况1)
    }
    void call_foo() const {
        foo();
    }
protected:
    virtual void foo() const = 0;
};

struct Derived : Base {
protected:
    virtual void foo() const {
        Base::foo(); // 噢,未实现虚基函数 (情况2)
    }
};

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

更新:可能是编译时错误。我在您的示例代码中观察到,record有一个非纯虚拟克隆()成员函数,返回一个record *。由于record是抽象的,您不能直接创建一个record(只能创建其具体子类)。这表明您的clone()成员函数也应该是纯虚拟的;如果它尝试(例如)return new record(),则会出现基类具有纯虚拟函数的错误。

好的,我明白你的意思了...也许这段代码导致了错误: int hashTable::hash(record *x){ return floor(m * (x->getID() * A - floor(x->getID() * A))); } - mlclmss
@ifiamnotmethenwhothehellami: 可能是; 但这取决于您实际传递的参数是什么。 - Infiltrator
@ifiamnotmethenwhothehellami:如果该代码是由记录的构造函数(直接或间接)调用的,那么这将导致错误。如果它是在sdata的构造函数开始之后但sdata的析构函数完成之前被调用,那么它不应该会引起问题。 - Adam H. Peterson
我曾经遇到过完全相同的问题,结果发现我有一个虚拟对象的std::vector,而不是指针。缺点是现在我必须在之后删除所有指针。 - Yvens Rebouças Serpa

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接