... другие члены public:
Tuna * Clone() const // виртуальная функция клонирования
{
return new Tuna(*this); // вернуть новый объект класса Tuna,
являющийся копией этого
Таким образом, виртуальная функция C lo n e () моделирует виртуальный конструктор копий, который должен быть вызван явно, как представлено в листинге 11.9.
ЛИСТИНГ 11.9. Классы Tuna и Carp с функцией Clone (),
моделирующей виртуальный конструктор копий______________________________________
#include
using namespace std;
2 :
class Fish
{
public:
virtual Fish* Clone () = 0;
virtual void Swim() = 0;
};
9:
10: class Tuna: public Fish
11: {
public:
Fish* Clone()
{
return new Tuna (*this);
}
17:
void Swim()
{
20:
|
cout « "Tuna swims fast in the sea" « endl;
|
2 1 :
|
}
|
2 2 :
|
};
|
23:
|
|
class Carp: public Fish
{
Fish* Clone ()
{
28 return new Carp(*this);
Виртуальные конструкторы копий?
|
297
|
void Swim ()
{
cout « "Carp swims slow in the lake" « endl;
6: int main()
const int ARRAY_SIZE = 4;
Fish* myFishes[ARRAY_SIZE] = {NULL};
myFishes[0] = new Tuna();
myFishes[1] = new Carp();
myFishes[2] = new Tuna();
myFishes[3] = new Carp();
о
r 6 Fish* myNewFishes[ARRAY_SIZE];
for (int Index = 0; Index < ARRAY_SIZE; ++Index) myNewFishes[Index] = myFishes[Index]->Clone();
4 9 :
5j: // вызов виртуального метода для проверки
for (int Index = 0; Index < ARRAY_SIZE; ++Index)
myNewFishes[Index]->Swim();
// очистка памяти
for (int Index = 0; Index < ARRAY_SIZE; ++Index)
{
delete myFishes[Index];
5 3 : delete myNewFishes[Index];
}
return 0;
-2: -}
Результат
Tuna swims fast in the sea
Carp swims slow in the lake
Tuna swims fast in the sea
Carp swims slow in the lake
Анализ
Строки 40 -44 в функции m a in () демонстрирую т объявление статического массива указателей на базовый класс F is h * и индивидуальное присвоение его элементам вновь
созданных объектов класса Tuna, C a rp , T una и C a r p соответственно. Обратите внимание на то, что этот массив m y F is h e s способен хранить объекты, казалось бы, разных типов, которые связаны общим базовым классом F is h . Это уже замечательно по сравнению с предыдущими массивами в этой книге, которые по большей части имели простой одно образный тип in t . Если этого недостаточно — замечательно, вы можете копировать в но вый массив m y N e w F is h e s типа F is h * при помощи вызова в цикле виртуальной функции
298 ЗАНЯТИЕ 11. Полиморфизм
F i s h : : C lo n e (), как показано в строке 48. Обратите внимание, что массив очень мал: только четыре элемента. Он может быть много больше, хотя это и не будет иметь большо го значения для логики копирования, а только потребует коррекции условия завершения цикла. Строка 52 фактически является проверкой, где вы вызываете виртуальную функ цию F i s h : : Sw im () для каждого хранимого в новом массиве элемента, чтобы проверить, скопировала ли функция C lo n e () объект класса T u n a как T u n a , а не только как F is h . Вывод демонстрирует, что все скопировано правильно.
РЕКОМЕНДУЕТСЯ
Отмечайте виртуальными те функции базового класса, которые должны быть переопределены в производных классах
Помните, что чистые виртуальные функции де лают класс абстрактным, а сами эти функции должны быть реализованы в производном классе
Учитывайте возможность использования вир туального наследования
Do'stlaringiz bilan baham: |