В С++ вы можете поместить член в базовый класс и член с тем же именем в унаследованном классе.
Как я могу получить доступ к определенному в унаследованном классе?
В С++ вы можете поместить член в базовый класс и член с тем же именем в унаследованном классе.
Как я могу получить доступ к определенному в унаследованном классе?
В этом случае вы должны полностью квалифицировать имя участника.
class A
{
public:
int x;
};
class B : public A
{
public:
int x;
B()
{
x = 0;
A::x = 1;
}
};
Если вы укажете имя, вы автоматически получите доступ к нему в унаследованном классе. Если вы имеете в виду, как вы получаете доступ к таковой в базовом классе, используйте Base:: member
Чтобы получить доступ к скрытому члену в базовом классе, вы должны префикс имени участника с именем базового класса. См. Ниже:
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;
};
Да.
Подтвердите свой вызов, f()
, с именем класса: SpecificClass::f()
.
Один подход (уже упоминавшийся во всех других ответах) заключается в использовании имени квалифицированного члена, например Base::member
. Его можно использовать в сочетании с явным доступом с помощью указателя this
, если ваш стиль: this->Base::member
.
Другим подходом является выполнение доступа через указатель this
, явно преобразованный в тип базового класса: ((Base *) this)->member
.
Конечно, приведенные выше ссылки на указатель this
сделаны в предположении, что вы пытаетесь получить доступ к члену из некоторой нестатической функции-члена класса. Для доступа, если от "снаружи", те же самые трюки могут применяться к любому другому указателю (или ссылке): some_pointer->Base::member
или ((Base *) some_pointer)->member
.
Для членов данных эти два подхода эквивалентны. Для функций-членов они могут приводить к различным результатам с помощью виртуальных функций. По этой причине, в общем, предпочтительным будет первый подход.
Префикс с помощью classname::
.