体系结构x86_64的未定义符号(C ++继承问题)

时间:2014-10-10 22:50:41

标签: c++ class inheritance abstract-class virtual-functions

这是我在编译时遇到的错误:

Undefined symbols for architecture x86_64:
  "typeinfo for BaseClass", referenced from:
      typeinfo for DerivedOne in base-49c1cd.o
      typeinfo for DerivedTwo in base-49c1cd.o
  "vtable for BaseClass", referenced from:
      BaseClass::BaseClass() in base-49c1cd.o
  NOTE: a missing vtable usually means the first non-inline virtual member function has no definition.
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make: *** [test] Error 1

这是base.h

class BaseClass {
public:
    // an enum
protected:
    float variable
public:
    float getVariable();
    void printBase();
    virtual BaseClass* clone();
    virtual float calculate(bool _one, bool _two) = 0;
};

class DerivedOne: public BaseClass {
public:
    DerivedOne(float _variable);
    BaseClass* clone();
    float calculate(bool _one, bool _two);
};

class DerivedTwo: public BaseClass {
public:
    DerivedTwo(float _variable);
    BaseClass* clone();
    float calculate(bool _one, bool _two);
};

base.cpp

#include "base.h"

float BaseClass::getVariable() {
    return variable;
}

void BaseClass::printBase() {
    return; // not implemented yet
}

DerivedOne::DerivedOne(float _variable) {
    variable = _variable;
}

BaseClass* DerivedOne::clone() {
    DerivedOne* tmp = new DerivedOne(variable);
    return tmp;
}

float DerivedOne::calculate(bool _one, bool _one) {
    float val = //some calculation;
    return val;
}

DerivedTwo::DerivedTwo(float _variable) {
    variable = _variable;
}

BaseClass* DerivedTwo::clone() {
    DerivedTwo* tmp = new DerivedTwo(variable);
    return tmp;
}

float DerivedTwo::calculate(bool _one, bool _two) {
    float val = //some calculation;
    return val;
}

我已经更改了变量的名称,所以我可能会输入错字。

我认为我遇到的问题源于我对构造函数和抽象类缺乏了解。任何人都可以为我解决问题吗?

2 个答案:

答案 0 :(得分:6)

您未提供BaseClass:clone方法的实施。使其成为纯虚拟,即=0或提供实现。

错误信息基本上讲述了整个故事:

  

注意:缺少vtable通常意味着第一个非内联虚拟成员函数没有定义。

您提供了声明,但未提供定义。

答案 1 :(得分:0)

请尝试在“base.cpp”

中添加以下内容
BaseClass::BaseClass()
{
    //do something (if there's any)
}
BaseClass::~BaseClass()
{
    //do something (if there's any)
}
BaseClass::clone()
{
    //do something (if there's any)
}

: - )

链接器正在寻找BaseClass的定义。 如果您不在上面的示例中的代码中编写它,它将产生未定义的引用链接器错误。 而clone(),因为它不是纯虚拟的,你需要为它创建一个默认实现,这样当派生类没有为它创建一个实现时,将使用基类中的实现。