非多继承产生的名字冲突问题
#include <iostream> using namespace std; class BASE1 { public: void show() { cout << i << "\n"; } protected: int i; }; class BASE2 { public: void show() { cout << j << "\n"; } protected: int j; }; class DERIVED: public BASE1, public BASE2 { public: void set(int x, int y) { i = x; j = y; } }; int main() { DERIVED obj; // 声明一个派生类的对象 obj.set(5, 7); // set()是DERIVED类自身定义的 obj.show(); // 存在二义性问题 return 0; }
存在二义性问题,因为无法确定调用的是BASE1还是BASE2的show函数。
解决方法:
(1)使用域作用符消除二义性
int main() { DERIVED obj; obj.set(5, 7); obj.BASE1::show(); obj.BASE2::show(); }
(2)重定义覆盖BASE1、BASE2的show函数
class DERIVED: public BASE1, public BASE2 { public: void set(int x, int y) { i = x; j = y; } void show() { cout << i << "\n"; cout << j << "\n"; } }; int main() { DERIVED obj; // 声明一个派生类的对象 obj.set(5, 7); // set()是DERIVED类自身定义的 obj.show(); // 无二义性问题,调用的是DERIVED中新定义的版本 obj.BASE1::show(); // 仍然可调用从BASE1继承下来show() obj.BASE2::show(); // 仍然可调用从BASE2继承下来show() return }