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

62:    for ( i = 0; i

63:    {

64:       cout << "(1)dog (2)cat (3)Mammal: ";

65:       cin >> choice;

66:       switch (choice)

67:       {

68:          case DOG: ptr = new Dog;

69:          break;

70:          case CAT: ptr = new Cat;

71:          break;

72:          default: ptr = new Mammal;

73:          break;

74:       }

75:       theArray[i] = ptr;

76:    }

77:    Mammal *OtherArray[NumAnimalTypes];

78:    for (i=0;i

79:    {

80:       theArray[i]->Speak;

81:       OtherArray[i] = theArray[i]->Clone;

82:    }

83:    for (i=0;i

84:       OtherArray[i]->Speak;

85:    return 0;

86: }


Результат: 

1: (1)dog (2)cat (3)Mammal: 1

2: Mammal constructor...

3: Dog constructor...

4: (1)dog (2)cat (3)Mammal: 2

5: Mammal constructor...

6: Cat constructor...

7: (1)dog (2)cat (3)Mammal: 3

8: Mammal constructor...

9: Woof!

10: Mammal Copy Constructor...

11: Dog copy constructor...

12: Meow!

13: Mammal Copy Constructor...

14: Cat copy constructor...

15: Mammal speak!

16: Mammal Copy Constructor...

17: Woof!

18: Meow!

19: Mammal speak!


Анализ: Листинг 11.11 похож на два предыдущих листинга, однако в данной программе в классе Mammal добавлен один новый виртуальный метод — Clone. Этот метод возвращает указатель на новый объект класса Mammal, используя конструктор-копировщик, параметр которого представлен указателем <

Метод Clone замещается в обоих производных классах — Dog и Cat — соответствующими версиями, после чего копии данных передаются на конструкторы- копировщики производных классов. Поскольку Clone является виртуальной функцией, то в результате будут созданы виртуальные конструкторы-копировщики, как показано в строке 81.

Пользователю предлагается выбрать объект класса 0og, Cat или Mammal. Объект выбранного типа создается в строках 62-74. В строке 75 указатель на новый объект добавляется в массив данных.

Затем осуществляется цикл, в котором для каждого объекта массива вызываются методы Speak и Clone (см. строки 80 и 81). В результате выполнения функции возвращается указатель на копию объекта, которая сохраняется в строке 81 во втором массиве.

В строке 1 вывода на экран показан выбор пользователем опции 1 — создание объекта класса Dog. В создание этого объекта вовлекаются конструкторы базового и производного классов. Эта операция повторяется для объектов классов Cat и Mammal в строках вывода 4-8.

В строке 9 вывода показано выполнение метода Speak для объекта класса Dog. Поскольку функция Speak также объявлена как виртуальная, то при обращении к ней вызывается та ее версия, которая соответствует типу объекта. Затем следует обращение еще к одной виртуальной функции Clone, виртуальность которой проявляется в том, что при вызове из объекта класса Dog запускаются конструктор класса Mammal и конструктор-копировщик класса Dog.

То же самое повторяется для объекта класса Cat (строки вывода с 12—14) и объекта класса Mammal (строки вывода 15 и 16). В результате создается массив объектов, для каждого из которых вызывается своя версия функции Speak.

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

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

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

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

Дональд Бокс

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