几个小时以来,我一直在尝试解决这个问题,但我找不到解决方案。代码示例:
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
最佳答案
更改您的基类以拥有一个纯虚拟成员:
class IColor {
public:
virtual void print() = 0;
};
就您的代码而言,您正在声明 IColor::print
但从未定义它,这会导致您的链接器提示未解析的引用。纯虚函数不需要定义,在这种情况下实际上没有定义是有意义的,因为每个叶类都必须覆盖此方法。
事实上,您很可能还需要一个虚拟析构函数:
virtual ~IColor() {}
关于c++ - 虚函数和双重继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23944804/