如何访问多级重写元素?

时间:2010-08-14 09:01:01

标签: c++ scope multiple-inheritance

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

#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似乎是c.B::x的一个很好的“解决方法”,但它们在虚函数方面并不相同,是吗?

3 个答案:

答案 0 :(得分:1)

c.A::x

答案 1 :(得分:1)

您可以通过参考演员表和范围操作符访问这两个版本的A,如下所示:((B1&) c).A::x((B2&) c).A::x

cout << ((A&) c).x << endl;在我的编译器上失败,因为编译器不知道你想要操作哪个A数据副本。

答案 2 :(得分:0)

它不起作用,编译器应该告诉你原因。至少我的确如此:-):“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;
}