C++. Бархатный путь. Часть 2 - Базовые и производные классы. Часть 3

ОГЛАВЛЕНИЕ

Нам остаётся рассмотреть, каким образом транслятор соотносит члены класса непосредственно в объекте. Для этого переопределим функцию main():

void main ()
{
C MyObj;
MyObj.x0 = 0;
MyObj.B::x0 = 1;
MyObj.C::x0 = 2;
MyObj.f0();
MyObj.A::f0();
MyObj.C::f0();
/*
Поиск "снизу-вверх" является для транслятора обычным делом.
Транслятор способен отыскать нужные функции и данные даже у
косвенного базового класса. Главное, чтобы они были там объявлены.
И при было бы возможным однозначное соотнесение класса и его члена.
*/
MyObj.x1 = 777;
MyObj.B::x1 = 999;
cout << MyObj.A::x1 << "-" << MyObj.B::x1;
/*
Процесс соотнесения осуществляется от потомков к предкам. Не
специфицированный член класса x1 считается членом "ближайшего"
производного класса, о чём и свидетельствует последняя тройка операторов.
*/
MyObj.B::f2();
MyObj.C::f2();
/*
И опять успешное соотнесение благодаря поиску "снизу-вверх". Недостающие
элементы в производном классе можно поискать по базовым классам. Важно,
чтобы они там были.
*/
// MyObj.A::f1();
// MyObj.A::f2();
// MyObj.A::f3();
// MyObj.B::f3();
/*
А вот "сверху вниз" транслятор смотреть не может. Предки не отвечают
за потомков.
*/
}

Таким образом, корректное обращение к членам класса в программе обеспечивается операцией разрешения области видимости. Квалифицированное имя задаёт область действия имени (класс), в котором начинается (!) поиск данного члена класса. Принципы поиска понятны из ранее приведённого примера.