Читаем Освой самостоятельно С++ за 21 день. полностью

Даже если вы заместили базовый метод, то все равно можете обратиться к нему, указав базовый класс, где хранится исходное объявление метода. Для этого в обращении к методу нужно явно указать имя базового класса, за которым следуют два символа двоеточия и имя метода. Например: Mammal: :Move.

Если в листинге 11.6 переписать строку 32 так, как показано ниже, то ошибка во время компиляции больше возникать не будет:

32: fido.Mammal::Move;

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

Листинг 11.7. Явное обращение к методу базового класса

1: //Листинг 11.7. Явное обращение к методу базового класса

2:

3: #include

4:

5: class Mammal

6: {

7:    public:

8:       void Move const { cout << "Mammal move one step\n"; }

9:       void Move(int distance) const

10:      {

11:         cout << "Mammal move " << distance;

12:         cout << " steps.\n";

13:      }

14:

15:   protected:

16:      int itsAge;

17:      int itsWeight;

18: };

19:

20: class Dog : public Mammal

21: {

22:    public:

23:       void Moveconst;

24:

25: };

26:

27: void Dog::Move const

28: {

29:    cout << "In dog move...\n";

30:    Mammal::Move(3);

31: }

32:

33: int main

34: {

35:    Mammal bigAnimal;

36:    Dog fido;

37:    bigAnimal.Move(2);

38:    fido.Mammal::Move(6);

39:    return 0;

40: }


Результат:

Mammal move 2 steps.

Mammal move 6 steps.


Анализ: В строке 35 создается объект bigAnimal класса Mammal, а в строке 36 — объект fido класса Dog. В строке 37 вызывается метод Move(int) из базового класса для объекта класса Dog.

В предыдущей версии программы мы столкнулись с проблемой из-за того, что в классе Dog доступен только один замещенный метод Move, в котором не задаются параметры. Проблема была разрешена явным обращением к методу Move(int) базового класса в строке 38.


Рекомендуется:Повышайте функциональные возможности класса путем создания новых производных классов. Изменяйте выполнение отдельных функций в производных классах с помощью замещения методов.


Не рекомендуется:Не допускайте сокрытие функций базового класса из-за несоответствия сигнатур.

Виртуальные методы

 В этой главе неоднократно подчеркивалось, что объекты класса Dog одновременно являются объектами класса Mammal. До сих пор под этим подразумевалось, что объекты класса Dog наследуют все атрибуты (данные) и возможности (методы) базового класса. Но в языке C++ принципы иерархического построения классов несут в себе еще более глубинный смысл.

Полиморфизм в C++ развит настолько, что допускается присвоение указателям на базовый класс адресов объектов производных классов, как в следующем примере:

Mammal* pMammal = new Dog;

Данное выражение создает в области динамической памяти новый объект класса Dog и возвращает указатель на этот объект, который является указателем класса Mammal. Это вполне логично, так как собака — представитель млекопитающих.


Примечание:В этом суть полиморфизма. Например, можно объявить множество окон разных типов, включая диалоговые, прокручиваемые окна и поля списков, после чего создавать их в программе с помощью единственного виртуального метода draw. Создав указатель на базовое окно и присваивая этому указателю адреса объектов производных классов, можно обращаться к методу draw независимо от того, с каким из объектов в данный момент связан указатель. Причем всегда будет вызываться вариант метода, специфичный для класса выбранного объекта.


Затем этот указатель можно использовать для вызова любого метода класса Mammal. Причем если метод был замещен, скажем, в классе Dog, то при обращении к методу через указатель будет вызываться именно вариант, указанный в данном производном классе. В этом суть использования виртуальных функций. Листинг 11.8 показывает, как работает виртуальная функция и что происходит с не виртуальной функцией.

Листинг 11.8. Использование виртуальных методов

1: //Листинг 11.8. Использование виртуальных методов

2:

3: #include

4:

5: class Mammal

6: {

7:    public:

8:       Mammal:itsAge(1) { cout << "Mammal constructor...\n"; }

9:       virtual ~Mammal { cout << "Mammal destructor...\n"; }

Перейти на страницу:

Похожие книги

Сущность технологии СОМ. Библиотека программиста
Сущность технологии СОМ. Библиотека программиста

В этой книге СОМ исследуется с точки зрения разработчика C++. Написанная ведущим специалистом по модели компонентных объектов СОМ, она раскрывает сущность СОМ, помогая разработчикам правильно понять не только методы модели программирования СОМ, но и ее основу. Понимание мотивов создания СОМ и ее аспектов, касающихся распределенных систем, чрезвычайно важно для тех разработчиков, которые желают пойти дальше простейших приложений СОМ и стать по-настоящему эффективными СОМ-программистами. Показывая, почему СОМ для распределенных систем (Distributed СОМ) работает именно так, а не иначе, Дон Бокс дает вам возможность применять эту модель творчески и эффективно для ежедневных задач программирования.

Дональд Бокс

Программирование, программы, базы данных / Программирование / Книги по IT