如何访问多个级别的覆盖元素?

发布于 2024-09-14 00:17:15 字数 827 浏览 6 评论 0原文

如何访问基类的基类的重写成员?

#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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

凡间太子 2024-09-21 00:17:15

您可以通过引用强制转换加上作用域运算符来访问 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.

单身情人 2024-09-21 00:17:15
c.A::x
c.A::x
伏妖词 2024-09-21 00:17:15

它不会工作,编译器应该告诉你原因。至少我的:-):“C 的基础不明确”。答案是虚拟继承

#include <iostream>
using namespace std;

class A {public: char x; A(){x='A';};};
class B1 : public virtual A {public: char x; B1(){x='B';};};
class B2 : public virtual 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;
}

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

#include <iostream>
using namespace std;

class A {public: char x; A(){x='A';};};
class B1 : public virtual A {public: char x; B1(){x='B';};};
class B2 : public virtual 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;
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文