Информационный сайт

 

Реклама
bulletinsite.net -> Книги на сайте -> Программисту -> Янг Майкл Дж. -> "Visual С++ 6. Полное руководство: В 2 т.(том1)" -> 51

Visual С++ 6. Полное руководство: В 2 т.(том1) - Янг Майкл Дж.

Янг Майкл Дж. Visual С++ 6. Полное руководство: В 2 т.(том1) — Бином, 2006. — 569 c.
Скачать (прямая ссылка): vicualcc2006t1.djvu
Предыдущая << 1 .. 45 46 47 48 49 50 < 51 > 52 53 54 55 56 57 .. 204 >> Следующая

class CMessageBox (
protected:
char *Message;
virtual void DrawBackground (int L, int T, int R, int B); // закрашивает фон окна сообщения в белый цвет public: CMessageBox() {
Message = new char ('\0'); )
-CMessageBox ( ) {
delete [] Message; )
void Display ( ) {
DrawBackground (0, 0, 35, 25);
// код для вывода строки сообщения ...
}
void Set (char *Msg);
);
Открытая функция-член Set позволяет передать строку сообщения, a Display выводит это сообщение на экран. Отметим: функция Display очищает фон,
вызывая другую функцию-член DrawBac kg round и передавая ей размеры окна сообщения. Эта функция закрашивает фон, используя непрозрачный белый цвет. Функция DrawBackground предназначена для использования внутри класса. Она не предназначена для вызова извне класса и, следовательно, объявлена как защищенный член класса.
Функция DrawBackground также объявлена виртуальной. Соответственно, при порождении от класса CMessageBox нового класса, содержащего собственную версию DrawBackGround, новая функция перекроет старую, даже если будет вызываться из функции-члена класса CMessageBox. Например, от класса CMessageBox можно породить следующий класс.
class CMyMessageBox : public CMessageBox f
protected:
virtual void DrawBackground (int l, int T, int R, int B) {
// закрашивает фон окна сообщения СИНИМ цветом ... )
);
Обратите внимание: новая версия функции DrawBackground создает синий фон, а не белый. Следовательно, в приведенном ниже фрагменте будет создано окно сообщения с синим фоном.
CMyMessageBox MyMessageBox;
MyMessageBox.Set ("hello"); MyMessageBox.Display ();
Делая функцию DrawBackground виртуальной, мы получаем возможность настраивать класс CMessageBox (а именно, цвет или узор, которым заполняется фон окна сообщения) без модификации исходного текста данного класса (при этом даже не нужно просматривать исходный программный код). Многие классы, определенные в библиотеке MFC, предусматривают использование виртуальных функций, которые можно переопределять в производных классах, что позволяет легко модифицировать MFC-классы.
Механизм переопределения
В данной главе введено понятие виртуальных функций. Вы уже знаете, что при вызове виртуальной функции с помощью указателя на объект класса, вызов будет интерпретироваться в соответствии с текущим типом объекта, а не указателя. Как это осуществляется для виртуальных функций, вызываемых внутри функций-членов базового класса?
Вспомним: ссылка на член класса из функции-члена неявно связана с применением указателя this. Таким образом, функцию Display класса CMessageBox можно записать следующим способом.
class CMessageBox
II ДрУГИе Определения
public: void Display ( )
{
this->DrawBackground (0, 0, 35, 25);
// ...
}
// другие определения ...
);¦
Если бы функция DrawBackground не являлась виртуальной, то ее вызов из функции Display инициализировал бы вызов версии DrawBackground класса CMessageBox (так как в пределах этого класса указатель this является указателем на объект класса CMessageBox). Однако если функция DrawBackground является виртуальной, ее вызов инициализирует вызов версии DrawBackground класса текущего объекта. Таким образом, если функция Display вызвана для объекта класса CMyMessageBox, то будет вызвана и DrawBackground, определенная внутри данного класса.
CMyMessageBox MyMessagBox; // ...
MyMessageBox.Display ();
Итоги
В данной главе рассматривалась базовая методика создания новых классов, производных от уже существующих, а также способы построения иерархии родственных (связанных) классов. Введено понятие виртуальных функций и описаны некоторые способы их использования. Ниже перечислены основные концепции этой главы.
• Вы можете создать новый класс, порожденный от существующего, указав имя существующего класса в определении нового. Существующий класс в этом случае называют базовым, а новый класс — производным.
• Производный класс наследует все члены базового класса. В производный класс можно добавить новые члены для его настройки в соответствии с вашими требованиями.
• Конструктор производного класса может явно инициализировать свой базовый класс путем передачи параметров конструктору базового класса. Если конструктор производного класса неявно инициализирует базовый класс, компилятор автоматически вызывает конструктор по умолчанию базового класса.
• Если члены базового класса объявлены со спецификатором доступа protected, то они доступны в производных классах, но не доступны для других функций программы.
• Производный класс может служить базовым для других классов, что позволяет создавать многоуровневую иерархию связанных классов.
• Наследование (способность порождать один класс из другого) позволяет повторно использовать коды и структуры данных, ранее созданные для других классов. Это делает программу более понятной и помогает в моделировании взаимосвязей между объектами, управляемыми программой.
• Каждый класс в иерархии производных классов может иметь собственные версии отдельных функций-членов. Если функция объявлена как virtual, ее вызов будет автоматически инициализировать вызов версии, определенной для класса текущего объекта, даже если функция вызывается с помощью указателя на базовый класс.
Предыдущая << 1 .. 45 46 47 48 49 50 < 51 > 52 53 54 55 56 57 .. 204 >> Следующая
Реклама
Авторские права © 2009 AdsNet. Все права защищены.
Rambler's Top100