Составители:
Рубрика:
52
Квалифицированное имя компонента класса может быть использо-
вано и вне его компонентных функций. Для доступа в таком случае
можно использовать выражение вида
имя_объекта . имя_класса :: имя_компонента
//Листинг 21. Пример использования квалифицированного имени компонент класса
из
//его окружения:
main()
{ C c;
c.C::c2=0;
c.B::funcB();
c.A::a2=2;
c.C::funcA();
}
Поиск компонента при обращении к нему всегда идет "снизу-вверх". Для
вызова с.С::funcA() транслятор сначала проверит наличие функции funcA в классе
С и, если такой имеется, занесет адрес метода этого класса для вызова. Если в
классе С нет метода с таким названием, будет рассмотрен прямой базовый класс
для С (
в нашем случае – класс В) и поиск метода продолжится в нем. Если метод с
таким именем будет найден – его адрес будет помещен на место вызова, иначе –
поиск будет продолжен на следующем уровне иерархии классов (в классе А для
рассматриваемого примера).
Еще одно важное свойство базовых и производных классов
иллюстрируется в листинге
22.
//Листинг 22. Приведение указателей производного класса к базовому
main()
{A *pta;
C c;
pta=&c;
pta->funcA();
}
.
В программе определен указатель на базовый класс A и объект
производного класса С. При этом присвоение указателю pta адреса объекта c не
потребовало операций приведения типа.
Данный пример показывает, что
указатель на базовый класс может ссылаться на объекты производных классов.
Квалифицированное имя компонента класса может быть использо- вано и вне его компонентных функций. Для доступа в таком случае можно использовать выражение вида имя_объекта . имя_класса :: имя_компонента //Листинг 21. Пример использования квалифицированного имени компонент класса из //его окружения: main() { C c; c.C::c2=0; c.B::funcB(); c.A::a2=2; c.C::funcA(); } Поиск компонента при обращении к нему всегда идет "снизу-вверх". Для вызова с.С::funcA() транслятор сначала проверит наличие функции funcA в классе С и, если такой имеется, занесет адрес метода этого класса для вызова. Если в классе С нет метода с таким названием, будет рассмотрен прямой базовый класс для С (в нашем случае – класс В) и поиск метода продолжится в нем. Если метод с таким именем будет найден – его адрес будет помещен на место вызова, иначе – поиск будет продолжен на следующем уровне иерархии классов (в классе А для рассматриваемого примера). Еще одно важное свойство базовых и производных классов иллюстрируется в листинге 22. //Листинг 22. Приведение указателей производного класса к базовому main() {A *pta; C c; pta=&c; pta->funcA(); }. В программе определен указатель на базовый класс A и объект производного класса С. При этом присвоение указателю pta адреса объекта c не потребовало операций приведения типа. Данный пример показывает, что указатель на базовый класс может ссылаться на объекты производных классов. 52
Страницы
- « первая
- ‹ предыдущая
- …
- 50
- 51
- 52
- 53
- 54
- …
- следующая ›
- последняя »