下面是我在編譯時發現了錯誤:未定義符號
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()',因爲它是在派生類中實現的。謝謝! – n0pe 2014-10-10 23:02:35
此外,它是「純粹的虛擬」,而不是抽象的。當一個類有(至少有一個)純虛函數時,該類是抽象的。除了使用'= 0;'來聲明一個純虛擬成員嗎? – Deduplicator 2014-10-10 23:03:35
@Deduplicator,謝謝,似乎c#成了我的主要語言... – 2014-10-10 23:04:51