缺少vtable:是否应该在头文件中重新声明虚拟函数
Missing vtable: should virtual function be redeclared in header file?
我收到错误NOTE: a missing vtable usually means the first non-inline virtual member function has no definition. "vtable for Algorithm2A"
。我假设我的基类中的问题是,我将函数声明为纯虚拟的,然后在派生类的头.h
中我重新声明了它,以便能够在实现文件.cpp
中实现它。
IAlgorith2.h——这是我的抽象类
#include "IAlgorithm1.h"
//! Algorithm2 interface
class IAlgorithm2 {
public:
~IAlgorithm2() {
}
virtual std::vector<int> calculateLCP(std::string BWT)=0;
};
现在,我已经在Algorithm2.h
和Algorithm2.cpp
中实现了这一点。
算法2A.hpp
class Algorithm2A : public IAlgorithm2 {
protected:
IAlgorithm1 &algorithm1;
std::vector<Interval> getIntervals(int i, int j) {
return algorithm1.getIntervals(i, j);
}
public:
Algorithm2A(IAlgorithm1 &a) : algorithm1(a) {
}
std::vector<int> calculateLCP(std::string BWT);
};
算法2A.cpp
#include "Algorithm2A.hpp"
std::vector<int> Algorithm2A::calculateLCP(std::string BWT) {
// implementation of this
}
应该如何做到这一点?如果我从Algorithm2A.h
中删除它不会编译的定义,如果我把它留在那里,那么就会出现vtable问题。
编辑:这不是模板的问题
IAlgorith1.h
//! Algorithm1 interface
class IAlgorithm1 {
protected:
virtual std::string uniqueCharsInInterval(int i, int j)=0;
public:
~IAlgorithm1() {
}
virtual std::vector<Interval> getIntervals(int i, int j)=0;
};
#endif /* Algorithm1_h */
算法1A.h
#include "IAlgorithm1.h"
class Algorithm1A : public IAlgorithm1 {
protected:
IRank &rank;
OrderedAlphabet &alphabet;
std::map<symbol_type, occurence_type> &C;
std::string &BWT;
public:
Algorithm1A(IRank &r,
OrderedAlphabet &a,
std::map<symbol_type, occurence_type> &c,
std::string &bwt):
rank(r), alphabet(a), C(c), BWT(bwt) {
}
std::string uniqueCharsInInterval(int i, int j);
还有一个实现文件Algorithm1A.cpp
缺少vtable通常意味着第一个非内联虚拟成员函数没有定义
错误消息告诉你出了什么问题!IAlgorithm2
中的第一个非内联虚拟成员函数未定义!
由于您目前的第一个此类函数是calculateLCP
,并且实际上并不希望定义它,因此常见的解决方案是为IAlgorithm2
提供一个虚拟析构函数(无论如何都应该这样做),并使用一个空定义。
您还需要为已声明的Algorithm2A::~Algorithm2A
提供一个定义,或者删除该声明。
相关文章:
- 我们可以在没有新实例化的情况下声明一个抽象方法来返回抽象超类中的子类对象吗
- 新运算符分配的大小大于声明的大小.为什么
- 为什么我不能只用前向声明 c++ 声明类的静态成员?
- 垫子声明:声明尺寸和大小()不同
- 如何从构造函数声明新的私有变量?
- 使用具有新信号槽语法的Qt插件系统在接口类中声明信号
- 使用 basic_string 声明新类型的字符串
- 声明数组时出现 SIGSEGV 错误,而不创建新的 int[size]
- STD :: bad_alloc在声明新的int [n]时
- 了解函数错误的歧义新声明
- 在C++中,如何在没有新元素且不单独声明单个元素的情况下创建"std::initializer_list<base *>"?
- 使用模板在类中声明新函数
- 元编程:动态声明一个新结构
- 使用括号会在声明新节点时会产生错误
- QT应用程序声明新对象后崩溃
- 新声明在使用delete时包含垃圾值和堆损坏
- 为什么新运算符没有声明为 [[nodiscard]]?
- 您只是调用前方声明和原型声明“声明”
- C++:友元声明'声明一个非模板函数
- C++在新函数声明器语法中访问此