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类的功能。