继承产生的名字冲突问题
#includeusing 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}