我一直在努力解决这个问题几个小时,但我无法找到解决方案。代码示例:
class IColor { // color interface
public:
virtual void print();
};
class Color : public IColor { // abstract color class
};
class RGB : public Color { // color implementation
public:
void print()
{
std::cout << "hi";
}
};
int main() {
IColor* col = new RGB();
col->print();
return 0;
}
但是,编译结果是链接器错误:
/home/snndAJ/ccnvQHgL.o:(.rodata._ZTI5Color[_ZTI5Color]+0x8): undefined reference to `typeinfo for IColor'
/home/snndAJ/ccnvQHgL.o:(.rodata._ZTV5Color[_ZTV5Color]+0x8): undefined reference to `IColor::print()'
collect2: error: ld returned 1 exit status
(不)在线工作示例:https://ideone.com/YikYwe
答案 0 :(得分:5)
将您的基类更改为 pure 虚拟成员:
class IColor {
public:
virtual void print() = 0;
};
正如您的代码所代表的那样,您声明IColor::print
但从未定义它,这会导致您的链接器抱怨的未解析的引用。纯虚函数不需要定义,实际上在这种情况下没有定义是有意义的,因为每个叶类必须覆盖此方法。
事实上,您很可能还需要一个虚拟析构函数:
virtual ~IColor() {}