如何访问多个级别的覆盖元素?
如何访问基类的基类的重写成员?
#include <iostream>
using namespace std;
class A {public: char x; A(){x='A';};};
class B1 : public A {public: char x; B1(){x='B';};};
class B2 : public A {public: char x; B2(){x='B';};};
class C : public B1, public B2 {public: char x; C(){x='C';};};
int main(){
C c;
cout << c.x << endl; // prints C
cout << c.B1::x << endl; // prints B
cout << ((B1&) c).x << endl; // prints B
// cout << c.A::x << endl; // normally prints A but doesn't work here
cout << ((A&) c).x << endl; // prints A
return 0;
}
引用(或指针)方式是唯一的可能性吗? 我尝试了 A::B::x 来链接作用域运算符,但这不起作用。 假设我想保留“双A”,即不使继承虚拟。
((B&) c).x
似乎是 cB::x
的一个很好的“解决方法”,但它们在虚函数的情况下并不相等,是吗? ?
How do I access overridden members of base classes of base classes?
#include <iostream>
using namespace std;
class A {public: char x; A(){x='A';};};
class B1 : public A {public: char x; B1(){x='B';};};
class B2 : public A {public: char x; B2(){x='B';};};
class C : public B1, public B2 {public: char x; C(){x='C';};};
int main(){
C c;
cout << c.x << endl; // prints C
cout << c.B1::x << endl; // prints B
cout << ((B1&) c).x << endl; // prints B
// cout << c.A::x << endl; // normally prints A but doesn't work here
cout << ((A&) c).x << endl; // prints A
return 0;
}
Is the reference (or pointer) way the only possibility?
I tried A::B::x in order to chain scope operators, but that doesn't work.
Suppose i want to keep the "double A", i.e. not make the inheritance virtual.
((B&) c).x
seems to be a good "workaround" to c.B::x
but they aren't equal in case of virtual functions, are they?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
您可以通过引用强制转换加上作用域运算符来访问 A 的两个版本,如下所示:
((B1&) c).A::x
和((B2&) c).A ::x
。cout << ((A&)c).x << endl;
在我的编译器上失败,因为编译器不知道您要操作 A 数据的哪个副本。You can access both version of A via reference casts plus the scoping operator, likes this:
((B1&) c).A::x
and((B2&) c).A::x
.cout << ((A&) c).x << endl;
fails on my compiler because the compiler doesn't know which copy of A's data you want to operate on.它不会工作,编译器应该告诉你原因。至少我的:-):“C 的基础不明确”。答案是虚拟继承
It won't work and the compiler should tell you why. At least mine does :-) : "A ambigous base for C". The answer is virtual inheritance