Доступ к переопределенному члену базового класса из объекта производного класса - PullRequest
2 голосов
/ 06 октября 2010

У меня есть два класса:

class A
{
public:
  int i;
};

class B : public A
{
public:
  int i;
};

Предположим, что я создал объект для класса B

B b;

Возможно ли получить доступ к A::i, используя b?

Ответы [ 5 ]

7 голосов
/ 06 октября 2010

Возможно ли получить доступ к A :: i, используя b?

Да! Как насчет b.A::i? ;)

4 голосов
/ 06 октября 2010

Да

int main()
{
    B b;

    b.i = 3;
    b.A::i = 5;

    A *pA = &b;
    B *pB = &b;
    std::cout << pA->i << std::endl;
    std::cout << pB->i << std::endl;
}
2 голосов
/ 13 августа 2013

Это возможно, как ответили другие. Но в приведенном вами примере базовый и производные элементы совпадают, тип данных не был переопределен.

Это будет актуально в случае производных классов, которые определяют новый тип данных для базовых членов, как показано в этом посте: Наследование C ++. Изменение типов данных объекта

2 голосов
/ 06 октября 2010

Да, вы можете. Чтобы узнать, прочитайте это

Метод переопределения предоставляет новую реализацию члена, унаследованного от базового класса. Метод, переопределенный объявлением переопределения, называется переопределенным базовым методом. Переопределенный базовый метод должен иметь ту же сигнатуру, что и переопределенный метод.

Из производного класса, у которого есть метод переопределения, вы все равно можете получить доступ к переопределенному базовому методу с тем же именем, используя ключевое слово base. Например, если у вас есть виртуальный метод MyMethod () и метод переопределения в производном классе, вы можете получить доступ к виртуальному методу из производного класса с помощью вызова:

base.MyMethod ()

1 голос
/ 06 октября 2010

Два способа:

struct A{
    A():i(1){}
    int i;
};

struct B : A{
    B():i(0), A(){}
    int i;
};

int main(){
    B b;
    cout << b.A::i;
    cout << (static_cast<A&>(b)).i;
}
...