![]() |
|
Программирование >> Расширенная версия языка c++
class base { public: -j . - - . . int i; . , base (int x) { i = x; } - virtual void funcO , cout Выполнение функции func О базового класса: ; cout i \n; ... .... .: --.if , -, ; .i-i class derivedl: public base { - -.ti-r,:- public: frff:-;- ПЛ - - derivedl (intx) : base (x) { } ; v..-v voldfunc() cout << Выполнение функции f unc () класса derivedl: ; cout <x 1 * 1 \n; class derived2: public base { public : : . . derived2(int x) : base(x) { } в классе derlved2 функция func ( ) не подменяется . ,.. int main О . * , base *p; base ob(lO) ; derivedl d obl(10) ; derlved2 d ob2(10); ,c-,v..i p = sob; p->func(); функция func ( ) базового класса : i- Ключевым для понимания предьщущего примера является тот факт, что, во-нервгх, тип адресуемого через указатель объекта определяет вызов той или иной версии подменяемой виртуальной функции, во-вторых, выбор конкретной версии происходит уже в процессе выполнения программы. 2. Виртуальные функции имеют иерархический порядок наследования. Кроме того, если виртуальная функция не подменяется в производном классе, то используется версия функции, определенная в базовом классе. Например, ниже приведена слегка измененная версия предыдущей программы: Иерархический порядок виртуальных функций #include <io3treaim> using namespace std; . р = Sd obl; p->func(); функция fimc{) производного класса derivedl - . . p->func(); функция func () базового класса return 0; г -i . : . ). После выполнения программы на экран выводится следующее: Выполнение функции пс() базового класса: 10 Выполнение функции f unc ( ) класса derivedl: 100 Выполнение функции func () базового класса: 10 В этой программе в класса ved2 функция func() не подменяется. Когда указателю р присваивается адрес объекта d ob2 и вызывается функция func(), используется версия функции из класса base, поскольку она следующая в иерархии классов. Обгчно, если виртуальная функция не переопределена в производном классе, используется ее версия из базового класса. 3. В следующем примере показано, как случайные собгтия во время работы программы влияют на вызываемую версию виртуальной функции. Программа выбирает между объектами d obl и d ob2 на основе значений, возвращаемых стандартным генератором случайных чисел rand(). Запомните, выбор конкретной версии функции func() происходит во время работы программы. (Действительно, при компиляции этот выбор сделать невозможно, поскольку он основан на значениях, которые можно получить только во время работы программы.) /* В этом примере показана работа виртуальной функции при наличии случайных событий во время выполнения программы. #include <iostream> #include <cstdlib> using namespace std; class base { public: int i; - base (intx} { i = x; } virtual void func() { cout Выполнение функции func() базового класса: ; cout i class derivedl: public base { , i-L . public: derivedl (intx) : base(x) { ) - void fimcO
cout Волнение функции Ш1С () класса derivedl: ; cout i * i << \n; class derived2: public base { public: derived2(int x) : Ьазе(х) { } void func ( ) cou шолнение функции c{) класса derived2: ; cout i + i \n ; int mainO base *p; derivedl d obl(10); derived2 d ob2(10); int 1, j; for(i=0; i<10; 1++} { : - j = rand{); ifUj*2)) p bl; если число нечетное использовать объект d obl else p 2; если число четное использовать объект d ob2 p->func{); вызов подходящей версии функции return 0; 4. Теперь более реальный пример использования виртуальной функции. В этой программе создается исходный базовый класс area, в котором сохраняются две размерности фигуры. В нем также объявляется виртуальная функция getareaO, которая, при ее подмене в производном классе, возвращает площадь фигуры, вид которой задается в производном классе. В этом случае определение функции getareaO внутри базового класса задает интерфейс. Конкретная реализация остается тем классам, которые наследуют класс area. В этом примере рассчитывается площадь треугольника и прямоугольника. Использование виртуальное киии для определения интерфейса ttinclude <iostream> using namespace std;
|
© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |