未实现的纯虚方法
Unimplemented Pure Virtual Method?
问题是:在尝试编译时,我一直得到未实现的纯虚拟方法错误。我已经在抽象基类中实现了所有的纯虚方法。什么好主意吗?
是抽象基类:
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)));
}
如果看不到导致错误的代码,就很难确切地知道发生了什么。如果这是一个编译时错误,我在这里没有看到任何会导致它的东西。
然而,如果你看到一个运行时错误,我能想到的两个最常见的原因是:
(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(); }
== UPDATE:可能的编译时错误==
我观察到在您的示例代码中,记录有一个非纯虚拟克隆()成员函数返回record *
。因为记录是抽象的,你不能直接创建一个记录(只能创建它的具体子类)。这表明你的clone()成员函数可能也应该是纯虚的;如果它尝试(例如)return new record()
,你会得到一个错误,你的基类有纯虚函数。
听起来您没有实现抽象基类中的所有功能。如果基库中的函数签名为:
void SomeFuction() const;
在派生类中实现以下内容:
void SomeFuction();
那么您没有实现该功能,因为您省略了const
。GCC应该告诉你没有实现什么。
相关:如果你有基类的具体实现,你应该在派生类中隐藏它的名字。要查找您[不小心]隐藏的函数,使用-Woverloaded-virtual
。
- 使用非递归插入方法实现 AVL 树
- C++方法实现:是否可以避免每次都键入类名?
- 如何使用吸气剂方法实现C++封装
- 在C++中使用克隆方法实现多晶型效果
- 使用本机 JNI 静态方法实现C++ Java 运行时错误
- 双向链表插入方法实现 - 正在搜索哪个节点
- 没有虚拟调度的默认方法实现
- C 构造函数和方法实现
- C :如何使用相同的数据类使用不同的方法实现
- 将同一类的方法实现放在不同的对象文件中
- 私有方法实现编译错误
- 使用公共命名方法实现非公共赋值运算符
- 使用 SFINAE 在 Clase 模板中选择不同的方法实现
- 如何根据方法实现的声明顺序对其进行排序
- 使用一个方法实现不同类型赋值的优雅方式,并且没有警告
- 在运行时选择方法实现
- 将参数传递给c++ CORBA方法实现
- 静态constexpr方法实现导致GCC错误
- 包括c++中的头文件(类定义和方法实现)
- 如何在swig生成的代理类中更改特定的方法实现