Как получить доступ к нескольким уровням переопределенных элементов? - PullRequest
0 голосов
/ 14 августа 2010

Как получить доступ к переопределенным членам базовых классов базовых классов?

#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 ]

1 голос
/ 14 августа 2010

Вы можете получить доступ к обеим версиям A с помощью приведения ссылок, а также к оператору видимости, например: ((B1&) c).A::x и ((B2&) c).A::x.

cout << ((A&) c).x << endl; не удается выполнить в моем компиляторе, поскольку компилятор не знает, какойкопия данных А., с которыми вы хотите работать.

1 голос
/ 14 августа 2010
c.A::x
0 голосов
/ 14 августа 2010

Это не сработает, и компилятор должен сказать вам, почему. По крайней мере, мой делает :-): "Неоднозначная база для 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...