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



         

Указатели на объекты - часть 2


pObj

A AC

Ниже пунктирной линии - пустота. Для того чтобы убедиться в этом, мы усложним структуру класса A, определив в нём функцию Fun1. Конечно же, эта функция ничего не будет делать. Но у неё будет спецификация возвращаемого значения и непустой список параметров. Нам от неё большего и не требуется. Лишь бы сообщала о собственном вызове…

class A { public: int Fun1(int); }; int A::Fun1(int key) { cout << " Fun1( " << key << " ) from A " << endl; return 0; }

Аналогичной модификации подвергнем производные классы AB и AC (здесь предполагаются вызовы функций-членов непосредственно из функции main(), а потому надо помнить о спецификаторе public), а затем продолжим опыты.

class AB: public A { public: int Fun1(int key); }; int AB::Fun1(int key) { cout << " Fun1( " << key << " ) from AB " << endl; return 0; } class AC: public A { public: int Fun1(int key); int Fun2(int key);// В этом классе мы объявим вторую функцию. }; int AC::Fun1(int key) { cout << " Fun1( " << key << " ) from AC " << endl; return 0; } int AC::Fun2(int key) { cout << " Fun2( " << key << " ) from AC " << endl; return 0; }

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

MyAC.Fun2(2); //Вызвана AC::Fun2()… MyAC.Fun1(2); //Вызвана AC::Fun1()… MyAC.A::Fun1(2); //Вызвана A::Fun1()…

Следующие строки посвящены попытке вызова функций-членов по указателю на объект базового типа. Предполагается, что в данный момент он настроен на объект MyAC.

pObj->Fun1(2); //Вызвана A::Fun1()…

И это всё, что можно способен указатель на объект базового типа, если его настроить на объект производного типа. Ничего нового. Тип указателя на объект - базовый класс. В базовом классе существует единственная функция-член, она известна транслятору, а про структуру производного класса в базовом классе никто ничего не знает. Так что следующие операторы представляют пример того, что не следует делать с указателем на объекты базового класса, даже настроенного на объект производного класса.




Содержание  Назад  Вперед