问题是:我在尝试编译时一直收到未实现的纯虚方法错误。我已经在抽象基类中实现了所有纯虚方法。有什么想法吗?
这是抽象基类:
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)));
}
答案 0 :(得分:3)
如果没有看到导致错误的代码,很难确切地知道发生了什么。如果这是编译时错误,我在这里看不到会导致它的任何内容。
但是,如果您看到运行时错误,我能想到的两个最常见的原因是:
(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();
}
==更新:可能的编译时错误==
我在您的示例代码中观察到该记录具有返回record *
的非纯虚拟clone()成员函数。由于记录是抽象的,因此无法直接创建记录(仅限其具体的子类)。这表明你的clone()成员函数也可能是纯虚拟的;如果它试图(例如)return new record()
,你将得到一个错误,你的基类有纯虚函数。
答案 1 :(得分:1)
听起来你还没有实现抽象基类的所有功能。如果基础中的函数具有签名:
void SomeFuction() const;
您在派生类中实现以下内容:
void SomeFuction();
然后你没有实现这个功能,因为你省略了const
。海湾合作委员会应该告诉你你没有实施的目标。
相关:如果你有一个基本的具体实现,你会在派生类中隐藏它的名字。要查找[意外]隐藏的功能,请使用-Woverloaded-virtual
。