16. Скомпилировать и запустить проект. Последовательное нажатие кнопок Create, Assign, Call и Destroy показывает, что вызов унаследованных и добавленных методов происходит одинаково успешно.

В классе CleverDog можно объявить конструктор и деструктор. В этом случае вызов конструкторов и деструкторов будет происходить в следующем порядке:

При создании:

? вызов конструктора Dog.

? вызов конструктора CleverDog.

При уничтожении:

? вызов деструктора CleverDog.

? вызов деструктора Dog.

Независимо от количества ступеней наследования при вызове конструкторов всегда действует правило «Последовательно вызываются конструкторы от базового класса, лежащего в основе иерархии, до текущего класса», а при вызове деструкторов все происходит в обратном порядке, сначала вызывается деструктор текущего класса, затем его базового класса и далее до класса, лежащего в основе иерархии.

Полиморфизм

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

Упражнение 5.1 (продолжение)

17. Добавить в файл DogClass.h еще один класс, как показано в листинге 5.7. Добавленный класс полностью идентичен классу CleverDog, за тем исключением, что новая собака путает сложение и умножение.

Листинг 5.7

class StupidDog: public Dog {

public:

void Add(int x, int y){

int i = x*y;

char mm[32];

wchar_t *szStr = L"";

wchar_t mstr[32];

sprintf(mm,"Результат сложения: %d\n", i);

mbstowcs(mstr, mm, 32);

szStr = mstr;

MessageBox(NULL, szStr, TEXT(«TUT»), 0);

};

void Mult(int x, int y){

int i = x+y;

char mm[32];

wchar_t *szStr = L"";

wchar_t mstr[32];

sprintf(mm,"Результат умножения: %d\n", i);

mbstowcs(mstr, mm, 32);

szStr = mstr;

MessageBox(NULL, szStr, TEXT(«TUT»), 0);

};

};

18. В конец класса Dog нужно дописать два новых объявления, как показано в листинге 5.8. Листинг 5.8

virtual void Add(int x, int y) = 0;

virtual void Mult(int x, int y) = 0;

19. В файле OOP1.cpp нужно заменить объявление переменных типа CleverDog объявлением массива объектных переменных типа Dog, как это показано в листинге 5.9. Листинг 5.9

// Global Variables:

HINSTANCE g_hInst;

HWND g_hwndCB;

Dog *Dogs[4];

20. Изменить код обработчиков нажатий кнопок, как показано в листинге 5.10. Листинг 5.10

int i;

case IDC_BUTTON1:

Dogs[0] = new CleverDog();

Dogs[1] = new StupidDog();

Dogs[2] = new CleverDog();

Dogs[3] = new StupidDog();

break;

case IDC_BUTTON2:

for(i = 0; i<4; i++) {

delete Dogs[i];

Dogs[i] = NULL;

}

break;

case IDC_BUTTON3:

Dogs[0]->age = 200;

break;

case IDC_BUTTON4:

for(i = 0; i<4; i++)

Dogs[i]->Mult(20, 10);

break;

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

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