C++.Бархатный путь


Базовые и производные классы - часть 4


int C ::f1() { A::f0(); /*Вызов функции-члена класса A.*/ f0(); /* Для вызова этой функции можно не использовать специфицированного имени. Функция под именем f0 одна на все классы. И транслятор безошибочно определяет её принадлежность. */ A::x0 = 1; B::x0 = 2; C::x0 = 3; x0 = 4; /* К моменту разбора этой функции-члена, транслятору известна структура всех составных классов. Переменная x0 (как и функция f0) обладает уникальным именем и является общим достоянием базовых и производных классов. При обращении к ней может быть использовано как её собственное имя, так и имя с любой квалификацией. Аналогичным образом может быть также вызвана и функция f0(). */ B::f0(); C::f0(); /* Изменение значений данных-членов. */ //A::x1 = 1; /* Ошибка! Переменная x1 в классе A не объявлялась.*/ B::x1 = 2; C::x1 = 3; x1 = 4; /* Переменная x1 объявляется в двух классах. Транслятор определяет принадлежность данных-членов по квалифицированным именам. В последнем операторе присвоения транслятор считает переменную x1 собственностью класса C, поскольку этот оператор располагается "на территории" этого класса. Если бы класс C не содержал объявления переменной x1, последние три оператора были бы соотнесены с классом B. */ //A::xx = 1; /* Ошибка! Переменная xx в классе A не объявлялась.*/ B::xx = 2; C::xx = 3; xx = 4; /* Аналогичным образом обстоят дела с переменной xx, объявленной в классе B. Хотя xx не объявлялась в классе C, транслятор рассматривает эту переменную как элемент этого класса и не возражает против квалифицированного имени C::xx. В последнем операторе транслятор рассматривает переменную xx как член класса B. */ return 150; } Теперь переопределим функцию-член класса B. При её разборе (даже если определение этой функции располагается после объявления класса C), транслятор воспринимает лишь имена базовых классов. В это время транслятор забывает о существовании класса C. А потому упоминание этого имени воспринимается им как ошибка. int B ::f1() { A::f0(); A::x0 = 1; B::x0 = 2; //C::x0 = 3; /* Ошибка. */ x0 = 4; B::f0(); //C::f0(); /* Ошибка. */ /* Изменение значений данных-членов. */ //A::x1 = 1; /* Ошибка. Переменная x1 в классе A не объявлялась.*/ B::x1 = 2; //C::x1 = 3; /* Ошибка. */ x1 = 4; //A::xx = 1; /* Ошибка! Переменная xx в классе A не объявлялась.*/ B::xx = 2; //C::xx = 3; /* Ошибка. */ xx = 4; return 100; }




- Начало -  - Назад -  - Вперед -