c++ - 虚函数和双重继承

标签 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

最佳答案

更改您的基类以拥有一个虚拟成员:

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

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

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

virtual ~IColor() {}

关于c++ - 虚函数和双重继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23944804/

相关文章:

c++ - 无法从函数返回动态字符串

c++ - 在 SDL_blitsurface 中使用 SDL_Rect vector 时出现 C++ 运行时错误

c++ - 返回输入文件一行的开头,C++

c++ - 从 std::size_t 转换为 void

c++ - Ping "no resources"- 是什么原因造成的?

java - 使用比较器对对象的 ArrayList 进行排序,代码无法访问

ios - Swift:将子类类型的对象分配给具有泛型的基类类型的变量会产生错误

c++ - 如何正确重载从基类到继承的转换

java - 如果公共(public)成员访问私有(private)成员,则不继承私有(private)成员

ios - Objective C - 单例静态方法覆盖不适用于多个子类