对于基础2类的“vtable in”的未定义引用

时间:2012-06-12 02:20:37

标签: c++ vtable undefined-reference

我有以下代码:

// 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的未定义引用!这是我想念的吗?

2 个答案:

答案 0 :(得分:1)

对vtable的未定义引用通常表示第一个虚函数(通常存储vtable的地方)未链接。

由于没有提供Base2::getId的定义(第一个虚函数),因此没有vtable被链接。

Base2::getId添加定义或删除类定义中函数的声明。

答案 1 :(得分:1)

函数声明需要定义。否则,声明将简单地抑制函数定义(可能从基类继承)。您有以下选择:

  • string getId();班级声明或
  • 中删除Base2
  • 自己定义功能,或
  • 通过使用声明(例如using Base::getId;
  • )从合适的基类导入特定定义

另请注意以下内容:

 string IBase::getId(){};
  • 需要定义一个return语句(并返回一个可转换为string的对象)
  • 定义
  • 后不需要分号