1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 |
//Листинг #1 #include <iostream> using std::cout; class Sport{ //Общий класс, от которого унаследуются подвиды спортивных игр public: virtual void show_info(){ //Виртуальная функция "Показать информацию" cout << "ALL"; } virtual ~Sport(){} //Виртуальный деструктор }; class Football:public Sport{ //Наследуем вид спорта "футбол" public: void show_info(){ cout<<"Football"; //Показываем, что это футбол } }; class Basketball:public Sport{ //Наследуем вид спорта "баскетбол" public: void show_info(){ cout<<"Basketball"; //Показываем, что это баскетбол } }; int main(){ Football *football = new Football; //Выделяем память для объекта типа "футбол" Basketball *basketball = new Basketball; //Выделяем память для объета, типа "баскетбол" Sport *sport = new Sport; //Создаём общую переменную, которую будем соотносить с видом спорта Sport *temp = sport; //запоминаем адрес sport->show_info(); //Показываем информацию по этой переменной sport = football; //Меняем значение общей переменной, навязываем её футбол sport->show_info(); //Смотрим информацию cout <<'\n'; sport = basketball; //Меняем значение общей переменной, навязываем ей баскетбол sport->show_info(); //Смотрим информацию cout <<'\n'; // delete sport; //В данном примере спровоцирует двойное delete sport = temp; //Для корректного удаления sport возвращаем в исходное состояние после выделения delete sport; delete football; //Чистим память delete basketball; } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
//Листинг #2 #include <iostream> using namespace std; class Sport { public: virtual void NameOf() { cout << "Sport\n";} // Виртуальная функция void InvokingClass() { cout << "Invoked by Sport\n";} // Не виртуальная функция }; class Football : public Sport { public: void NameOf(){ cout << "Derived::Football\n";} // Виртуальная функция void InvokingClass(){ cout << "Invoked by Football\n";}; // Не виртуальная функция }; int main() { Football football; Football *pFootball = &football; Sport *pSport = &football; // Вызов функций pSport->NameOf(); // Вызывается виртуальная функция pSport->InvokingClass(); // вызывается не виртуальная функция. pFootball->NameOf(); // Вызывается виртуальная функция pFootball->InvokingClass(); // Вызывается не виртуальная функция } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 |
//Листинг #3 Подавление вызова виртуальной функции операцей разрешения области действия #include <iostream> using std::cout; class Sport{ //Общий класс, от которого унаследуются подвиды спортивных игр public: virtual void show_info(){ //Виртуальная функция "Показать информацию" cout << "ALL"; } virtual ~Sport(){} }; class Football:public Sport{ //Наследуем вид спорта "футбол" public: void show_info(){ cout << "Football"; //Показываем, что это футбол } }; class Basketball:public Sport{ //Наследуем вид спорта "баскетбол" public: void show_info(){ cout << "Basketball"; //Показываем, что это баскетбол } }; int main(){ Football *football = new Football; Basketball *basketball = new Basketball; Sport *sport = new Sport; Sport *temp = sport; sport->show_info(); sport = football; sport->show_info(); cout <<'\n'; sport = basketball; sport->show_info(); cout <<'\n'; football->Sport::show_info(); //<---- От наследника через его родителя обращаемся к родительской функции sport = temp; delete sport; delete football; //Чистим память delete basketball; } |
Добавить комментарий