C++ 架构x86_64的未定义符号(C+;+;继承问题)

C++ 架构x86_64的未定义符号(C+;+;继承问题),c++,class,inheritance,abstract-class,virtual-functions,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: Base

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

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;
}
我已经更改了变量的名称,所以我可能打错了


我认为我遇到的问题源于我对构造函数和抽象类缺乏了解。有人能帮我澄清一下吗?

您没有提供
BaseClass:clone
方法的实现。要么使其成为纯虚拟的,即
=0
,要么提供一个实现

错误消息基本上说明了整个情况:

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


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

请尝试在“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)
}
:-)

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

谢谢,我想我没有真正理解虚拟和严格虚拟之间的区别(我知道这有一个名称)。我认为我不需要在基类中声明
clone()
,因为它是在派生类中实现的。谢谢而且,它是“纯虚拟的”,而不是抽象的。当类(继承或不继承)至少有一个纯虚函数时,它是抽象的。你真的知道除了使用
=0
要声明纯虚拟成员吗?