C++虚继承下成员x调用歧义:是否必须删除子类成员?
虚继承后仍出现成员变量歧义的解决方法
代码示例
#include <iostream> using namespace std; class A { public: A(){cout<<"Constructing A\n";} ~A(){cout<<"Destructing A\n";} int x; }; class B : virtual public A { public: B(){cout<<"Constructing B\n";} ~B(){cout<<"Destructing B\n";} int x=20; }; class C : virtual public A { public: C(){cout<<"Constructing C\n";} ~C(){cout<<"Destructing C\n";} int x=50; }; class D : public B,public C { public: D(){cout<<"Constructing D\n";} ~D(){cout<<"Destructing D\n";} }; int main() { D obj; obj.x; //x invoked cout<<obj.x<<"\n"; return 0; }
编译错误
error: request for member ‘x’ is ambiguous
虚继承解决的是基类A的多实例问题,但它没法消除子类B、C各自声明的x与基类A的x之间的歧义——这里obj.x同时对应三个不同的成员:A::x、B::x、C::x,编译器无法确定你要访问哪一个,所以报错。
不需要删除B或C中的x,有以下几种解决方法:
明确指定类域访问:直接在访问时指明要获取哪个类的
x,比如:cout << obj.B::x << "\n"; // 访问B类的x,输出20 cout << obj.C::x << "\n"; // 访问C类的x,输出50 cout << obj.A::x << "\n"; // 访问A类的x,输出未初始化的随机值在D类中重定义x:在D类中声明
x,并明确指定要继承或使用哪个父类的x,比如:class D : public B,public C { public: D(){cout<<"Constructing D\n";} ~D(){cout<<"Destructing D\n";} int x = B::x; // 明确使用B的x作为D的x };此时
obj.x会直接访问D类的x,值为20。在B/C中使用using声明(谨慎使用):如果希望在B/C中优先使用A的
x,可以在B或C中添加using A::x;,但这会隐藏B/C自己的x;如果仅在其中一个类添加,访问obj.x仍会有歧义,所以通常不如直接指定类域直观。
内容的提问来源于stack exchange,提问作者iamut04
相关产品推荐
相关产品推荐

