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)
我已经更改了变量的名称,所以我可能会输入错字.
我认为我所遇到的问题源于我对构造函数和抽象类缺乏了解.任何人都可以为我清理事情吗?
您没有提供BaseClass:clone方法的实现.要么使它成为纯虚拟,也就是=0提供实现.
错误信息基本上讲述了整个故事:
注意:缺少vtable通常意味着第一个非内联虚拟成员函数没有定义.
您提供了声明,但没有提供定义.