Денис , есть такой термин, как Квалификация идентификатора. Соответственно, идентификатор может быть как полностью квалифицированным (fully qualified), так и частично (partially qualified). Обычно б
ольшая часть квалификации может быть автоматически подставлена во время трансляции кода. Однако, в целом ряде случаев нужно руками расширять квалификацию.
Возьмем такой
пример:
spoilerclass Foo
{
public:
void baz1( int bar )
{
this->bar = bar;
}
void baz2( int bar )
{
Foo::bar = bar;
}
void baz3( int bar )
{
this->Foo::bar = bar;
}
public:
int bar = 0;
};
Имя параметра функций соответствует имени поля класса. Это плохой стиль, но для примера - самое то. Частично квалифицированное имя "bar" в любой из функций будет ссылаться на как можно более локальные данные. В данном случае - именно на параметр, а не на поле класса. Теперь, чтобы сказать "поле класса bar" нам надо сделать квалификацию имени "bar" более полной. Самая полная квалификация используется в функции "baz3".
Любое имя может быть заменено на его полную квалификацию, включая и операторы. Можно написать "foo.operator->()" вместо "foo->", если класс "foo" имеет перегруженный оператор "->". Я не представляю зачем это нужно, но так тоже можно написать.
Можно
обратиться к перекрытой или виртуальной функции родительского класса.
К слову, полная квалификация очень редко когда действительно нужна. Например,
вот в этом шаблоне без расширения частичной квалификации поля "m_data" использовать его в наследнике не получится. А вот
в этом шаблоне без полной квалификации имени не получится взять указатель на статическую функцию шаблонного класса.