我有以下代码:
// IBase.h
#include <iostream>
class IBase{
public:
virtual string getId();
};
// IBase.cpp
#include "IBase.h"
string IBase::getId(){};
// Base.h
#include <iostream>
#include <string>
#include "IBase.h"
using namespace std;
class Base : public IBase{
protected:
string id;
public:
Base(string _id);
string getId();
};
// Base.cpp
#include "Base.h"
Base::Base(string _id){
id = _id;
}
string Base::getId(){
return id;
}
// Base2.h
#include <iostream>
#include <string>
#include "Base.h"
using namespace std;
class Base2 : public Base{
public:
Base2(string _id);
string getId();
};
// Base2.cpp
#include "Base2.h"
Base2::Base2(string _id) : Base(_id){};
当我编译项目时,我得到了针对Base2的'vtable in的未定义引用!这是我想念的吗?
答案 0 :(得分:1)
对vtable的未定义引用通常表示第一个虚函数(通常存储vtable的地方)未链接。
由于没有提供Base2::getId
的定义(第一个虚函数),因此没有vtable被链接。
为Base2::getId
添加定义或删除类定义中函数的声明。
答案 1 :(得分:1)
函数声明需要定义。否则,声明将简单地抑制函数定义(可能从基类继承)。您有以下选择:
string getId();
班级声明或Base2
using Base::getId;
另请注意以下内容:
string IBase::getId(){};
string
的对象)