虚函数和双继承

时间:2014-05-29 23:42:51

标签: c++ inheritance

我一直在努力解决这个问题几个小时,但我无法找到解决方案。代码示例:

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

1 个答案:

答案 0 :(得分:5)

将您的基类更改为 pure 虚拟成员:

class IColor {
public:
    virtual void print() = 0;
};

正如您的代码所代表的那样,您声明IColor::print但从未定义它,这会导致您的链接器抱怨的未解析的引用。纯虚函数不需要定义,实际上在这种情况下没有定义是有意义的,因为每个叶类必须覆盖此方法。

事实上,您很可能还需要一个虚拟析构函数:

virtual ~IColor() {}