1

我有以下代码:

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

4

2 回答 2

1

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

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

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

于 2012-06-12T02:24:40.987 回答
1

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

  • 删除string getId();fromBase2类声明,或
  • 自己定义函数,或者
  • 通过 using 声明从合适的基类导入特定定义,例如using Base::getId;

另请注意以下几点:

 string IBase::getId(){};
  • 需要定义一个 return 语句(并返回一个可转换为的对象string
  • 定义后不需要分号
于 2012-06-12T02:29:53.403 回答