Главная->Інформатика та програмування->Содержание->Доступ к виртуальным методам через указатели

ОБЪЕКТНО-ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ В C++ (4-Е ИЗДАНИЕ) (часть 11) онлайн

Доступ к виртуальным методам через указатели

Давайте сделаем одно маленькое изменение в нашей программе: поставим клю-

чевое слово virtual перед объявлением функции show() в базовом классе. Вот лис-

тинг того, что получилось — программы VIRT:

Листинг 11.2. Программа VIRT

 

// virt.cpp

// Доступ к виртуальным функциям через указатели

#include <iostream>

using namespace std;

///////////////////////////////////////////////

class Base                //Базовый класс

    {

    public:

  virtual void  show()    //Виртуальная функция

      {  cout << "Base\n"; }

    };

//////////////////////////////////////////////

class Derv1 : public Base //Производный класс 1

    {

    public:

  void  show()   

      {  cout << "Derv1\n"; }

    };

//////////////////////////////////////////////

class Derv2 : public Base //Производный класс 2

 

Листинг 11.2 (продолжение)

 

{

    public:

  void  show()   

      {  cout << "Derv2\n"; }

};

//////////////////////////////////////////////

int main()

{   

    Derv1 dv1;            //Объект производного класса 1

    Derv2 dv2;            //Объект производного класса 2

    Base* ptr;            //Указатель на базовый класс

 

    ptr = &dv1;           //Адрес dv1 занести в указатель

    ptr->show();           //Выполнить show()

    ptr = &dv2;           //Адрес dv2 занести в указатель

    ptr->show();           //Выполнить show()

    return 0;

}

 

На выходе имеем:

Derv1

Derv2

Теперь, как видите, выполняются методы производных классов, а не базового.

Мы изменили содержимое ptr с адреса из класса Derv1 на адрес из класса Derv2,

и изменилось реальное выполнение show(). Значит, один и тот же вызов

ptr->show()

ставит на выполнение разные функции в зависимости от содержимого ptr. Компи-

лятор выбирает функцию, удовлетворяющую тому, что занесено в указатель, а не

типу указателя, как было в программе NOTVIRT. Это показано на рис. 11.2.

 

Рис. 11.2. Доступ через указатель к виртуальным функциям

 

5