C++. Бархатный путь. Часть 2 Страница 20. Базовые и производные классы. Часть 3
|
Страница 20 из 48 Нам остаётся рассмотреть, каким образом транслятор соотносит члены класса непосредственно в объекте. Для этого переопределим функцию 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(); /* А вот "сверху вниз" транслятор смотреть не может. Предки не отвечают за потомков. */ }
Таким образом, корректное обращение к членам класса в программе обеспечивается операцией разрешения области видимости. Квалифицированное имя задаёт область действия имени (класс), в котором начинается (!) поиск данного члена класса. Принципы поиска понятны из ранее приведённого примера. |