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

n0p*_*0pe 2 c++ inheritance abstract-class virtual-functions class

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

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
Run Code Online (Sandbox Code Playgroud)

这是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);
};
Run Code Online (Sandbox Code Playgroud)

并且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;
}
Run Code Online (Sandbox Code Playgroud)

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

我认为我所遇到的问题源于我对构造函数和抽象类缺乏了解.任何人都可以为我清理事情吗?

Mic*_*ala 6

您没有提供BaseClass:clone方法的实现.要么使它成为纯虚拟,也就是=0提供实现.

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

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

您提供了声明,但没有提供定义.