C++关于多继承的顺序问题

AMD类对CPU和GPU的同时继承,为什么调用第二个继承的函数会出错


#include
using namespace std;
class CPU {//cpu类
public:
    virtual void caculate() = 0;
};
class GPU {//gpu类
public:
    virtual void vedio_caculate() = 0;
};
class Intel :public CPU {//Intel
public:
    void caculate() {
        cout << "is Intel's CPU" << endl;
    }
};
class NVIDIA :public GPU {//NVIDIA
public:
    void vedio_caculate() {
        cout << "is NVIDIA's GPU" << endl;
    }
};
class AMD :public CPU, public GPU {//AMD品牌的cpu和gpu
public:
    void CPU::caculate() {
        cout << "is AMD's CPU" << endl;
    }
    void GPU::vedio_caculate() {
        cout << "is AMD's GPU" << endl;
    }
};
class Computer {
public:
    Computer(CPU* p1, GPU* p2) :cpu(p1), gpu(p2) { ; }//构造函数赋值
    void show() {//展示电脑配置
        cout << "Computer:" << endl;
        cpu->caculate();
        gpu->vedio_caculate();
    }
    ~Computer() {//析构释放内存空间
        if ((cpu != NULL) && (gpu != NULL)) {
            delete cpu;
            delete gpu;
        }
        cpu = NULL;
        gpu = NULL;
    }
public:
    CPU* cpu;//电脑cpu
    GPU* gpu;//电脑gpu
};
void test() {
    //Computer myComputer_0(new Intel, new AMD);//这里AMD类的GPU部分出错
    Computer myComputer_1(new AMD, new NVIDIA);//AMD类的CPU部分没问题
    //把class AMD :public CPU, public GPU
    //改为class AMD :public GPU, public CPU
    //继承顺序对调后就是AMD类的CPU部分报错了
}
int main() {
    test();
    return 0;
}

参考GPT和自己的思路,在C++中,当一个类继承了多个父类时,如果这些父类拥有相同的函数名,那么就会出现名称冲突的问题。对于这种情况,解决方法是需要在子类中显式地指明要调用哪个父类的函数。

在本题中,AMD类同时继承了CPU和GPU类,并且这两个类都有一个名为caculate()和vedio_caculate()的虚函数。当AMD的子类对象调用这两个函数时,就会发生名称冲突的问题。在AMD类中需要显式地指明要调用哪个父类的函数,可以使用作用域解析运算符(::)来指明。修改AMD类的定义如下:

class AMD :public CPU, public GPU {//AMD品牌的cpu和gpu
public:
    void caculate() {//显式指明调用CPU类的caculate()函数
        CPU::caculate();
    }
    void vedio_caculate() {//显式指明调用GPU类的vedio_caculate()函数
        GPU::vedio_caculate();
    }
};

这样修改后,AMD类就可以正确地继承CPU和GPU类的函数,并且能够通过编译。同时,需要注意的是,当AMD的子类对象调用CPU类的caculate()函数时,实际上是调用了AMD类中的caculate()函数,而不是直接调用CPU类的caculate()函数。在AMD类的caculate()函数中,需要显式地调用CPU类的caculate()函数,才能实现CPU类的功能。