Унаследованный класс C ++ имеет одноименный член - PullRequest
14 голосов
/ 13 апреля 2010

В C ++ вы можете поместить члена в базовый класс и члена с таким же именем в унаследованном классе.

Как я могу получить доступ к определенному в унаследованном классе?

Ответы [ 7 ]

28 голосов
/ 13 апреля 2010

В этом случае вы должны полностью указать имя участника.

class A
{
public:
  int x;
};


class B : public A
{
public:
  int x;
  B() 
  { 
    x = 0;
    A::x = 1;
  }
};
7 голосов
/ 13 апреля 2010

Если вы укажете имя, вы получите доступ к имени в унаследованном классе автоматически. Если вы хотите сказать, как получить доступ к базовому классу, используйте Base :: member

6 голосов
/ 13 апреля 2010

Чтобы получить доступ к скрытому члену в базовом классе, вы должны добавить префикс имени члена к имени базового класса. Смотрите ниже:

class A
{
protected:
   int i;
};

class B : public A
{
public:
   void foo( void )
   {
      int a_i = A::i;
      int b_i = i;
      int b_i_as_well = B::i;
   }
private:
   int i;
};
4 голосов
/ 13 апреля 2010

Да.

Уточните свой звонок, f(), с именем класса: SpecificClass::f().

3 голосов
/ 13 апреля 2010

Один из подходов (уже упоминавшийся во всех других ответах) - использовать квалифицированное имя члена, например Base::member. Его можно использовать в сочетании с явным доступом через указатель this, если это ваш стиль: this->Base::member.

Другой подход заключается в выполнении доступа через указатель this, явно преобразованный в тип базового класса: ((Base *) this)->member.

Конечно, приведенные выше ссылки на указатель this сделаны при условии, что вы пытаетесь получить доступ к члену из некоторой нестатической функции-члена класса. Чтобы получить доступ извне, те же приемы могут быть применены к любому другому указателю (или ссылке): some_pointer->Base::member или ((Base *) some_pointer)->member.

Для элементов данных эти два подхода эквивалентны. Для функций-членов они могут привести к различным результатам с виртуальными функциями. По этой причине, как правило, первый подход должен быть предпочтительным.

3 голосов
/ 13 апреля 2010

Префиксом classname::.

1 голос
/ 26 июля 2018
#include <iostream>
using namespace std;

struct Base {
    int memfcn();
};

struct Derived : Base {
    int memfcn(int);
};

int main() {
    Derived d;
    Base b;
    d.Base::memfcn();  //you can even use :: in conjunction with dot(.). This is new to me.
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...