Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
1 виртуальные функции.doc
Скачиваний:
3
Добавлен:
10.07.2019
Размер:
124.42 Кб
Скачать

Виртуальные функции

Функция-элемент может быть объявлена как virtual. Ключевое слово virtual предписывает компилятору генерировать некоторую дополнительную информацию о функции. Если функция переопределяется в производном классе и вызывается с указателем (или ссылкой) базового класса, ссылающимся на представитель производного класса, эта информация позволяет определить, какой из вариантов функции должен быть выбран: такой вызов будет адресован функции производного класса.

Для виртуальных функций существуют следующие правила:

  • виртуальную функцию нельзя объявлять как static.

  • спецификатор virtual необязателен при переопределении функции в производном классе.

  • виртуальная функция должна быть определена в базовом классе и может быть переопределена в производном.

Пример программирования

Пример 1.2. Написать программу с наследованием класса стек от класса массив.

#include <iostream>

#include <stdlib.h>

using namespace std;

class massiv

{ int *num;

int kol;

public:

massiv(int n);

void print();

virtual int kolich(){return kol;}

void put(int k,int n){num[k]=n;}

~massiv(){delete num;}

};

massiv::massiv(int n)

{ num=new int[n];

kol=n;

for(int i=0;i<kol;i++) num[i]=random(100)-50;

}

void massiv::print()

{ for(int i=0;i<kolich();i++) cout<<num[i]<<" ";

cout<<endl;

}

class stec:public massiv

{ int top;

public:

stec(int);

virtual int kolich() {return top;}

void pop(int k);

};

stec::stec(int n):massiv(n)

{ top=0;

}

void stec::pop(int k)

{ put(top++,k); }

void main()

{ randomize();

massiv a(10);

a.print();

stec b(10);

b.pop(random(100)-50);

b.pop(random(100)-50);

b.pop(random(100)-50);

b.print();

}

Главное отличие виртуальной функции от просто перегруженной в том, какая функция будет вызываться при рассмотрении производного класса как базового.

Пример 1.3.

#include <iostream>

using namespace std;

class Base

{ public:

Base(){};

Print(){ cout<<”I’m a Base print”<<endl;}

virtual View(){ cout<<”I’m a Base view”<<endl;}

};

class Derived: public Base

{ public:

Derived(){};

Print(){ cout<<”I’m a Derived print”<<endl;}

View(){ cout<<”I’m a Derived view”<<endl;}

};

void main(void)

{ Base *A=new Base;

Derived *B=new Derived;

Base *C;

A->Print();

A->View();

B->Print();

B->View();

C=(Base *)B;

C->Print();

C->View();

}

Результат:

“I’m a Base print”

“I’m a Base view”

“I’m a Derived print”

“I’m a Derived view”

“I’m a Base print”

“I’m a Derived view”

Таким образом, мы видим, что виртуальные функции позволяют нам всегда работать с теми функциями, которые специфичны именно для используемого класса, даже когда мы рассматриваем его как базовый.

Контрольные вопросы

  1. Что собой представляет виртуальная функция?

  2. Можно ли виртуальную функцию объявить как static?

  3. Что такое чисто виртуальная функция?

Варианты заданий

Таблица 1.2

Номер варианта

Задание

1, 16

Разработать программу с использованием наследования классов, реализующую классы:

Используя виртуальные или чисто виртуальные функции, выведите на экран его характеристики.

2, 17

Разработать программу с использованием наследования классов, реализующую классы:

Используя виртуальные или чисто виртуальные функции, выведите на экран его характеристики.

3, 18

Р азработать программу с использованием наследования классов, реализующую классы:

Используя виртуальные или чисто виртуальные функции, выведите на экран его характеристики.

4, 19

Р азработать программу с использованием наследования классов, реализующую классы:

Используя виртуальные или чисто виртуальные функции, выведите на экран его характеристики.

5, 20

Р азработать программу с использованием наследования классов, реализующую классы:

Используя виртуальные или чисто виртуальные функции, выведите на экран его характеристики.

6, 21

Р азработать программу с использованием наследования классов, реализующую классы:

Используя виртуальные или чисто виртуальные функции, выведите на экран его характеристики.

7, 22

Р азработать программу с использованием наследования классов, реализующую классы:

Используя виртуальные или чисто виртуальные функции, выведите на экран его характеристики.

8, 23

Р азработать программу с использованием наследования классов, реализующую классы:

Используя виртуальные или чисто виртуальные функции, выведите на экран его характеристики.

9, 24

Р азработать программу, реализующую классы с использованием наследования:

Используя виртуальные или чисто виртуальные функции, выведите на экран его характеристики.

10, 25

Р азработать программу, реализующую классы с использованием наследования:

Используя виртуальные или чисто виртуальные функции, выведите на экран его характеристики.

11, 26

Р азработать программу, реализующую классы с использованием наследования:

Используя виртуальные или чисто виртуальные функции, выведите на экран его характеристики.

12, 27

Р азработать программу, реализующую классы с использованием наследования:

Используя виртуальные или чисто виртуальные функции, выведите на экран его характеристики.

13, 28

Р азработать программу, реализующую классы с использованием наследования:

Используя виртуальные или чисто виртуальные функции, выведите на экран его характеристики.

14, 29

Разработать программу, реализующую классы с использованием наследования:

Дом

(из какого материала, частный или аренда)

Жилище

(название, общая площадь)

Коттедж

(площадь земельного участка, количество этажей

Юрта

(на какое количество жителей

Используя виртуальные или чисто виртуальные функции, выведите на экран его характеристики.

15, 30

Р

Море

(внутреннее или нет, замерзает ли зимой)

азработать программу, реализующую классы с использованием наследования:

Водоем

(название, максимальная глубина

Озеро

(соленое или пресное, площадь поверхности)

Река

(горная или равнинная, протяженность)

Используя виртуальные или чисто виртуальные функции, выведите на экран его характеристики.

123