Microsoft Visual C++ и MFC. Программирование для Windows 95 и Windows NT | страница 20
В программе создается объект класса Rectangle, а затем несколько раз вызываются методы PrintName и PrintDimention. В зависимости от того, как вызывается метод, будет работать метод, определенный в классе Figure или Rectangle.
>#include
>// Базовый класс Figure
>class Figure {
>public:
> // Виртуальный метод
> virtual void PrintName(void) {cout << Figure PrintName << ‘\n’}
> // Невиртуальный метод
> void PrintDimention(void) {cout << Figure PrintDimention << ‘\n’}
>};
>// Порожденный класс Rectangle
>class Rectangle : public Figure {
> // Переопределяем виртуальный метод базового класса
> virtual void PrintName(void) {cout << Rectangle PrintName << ‘\n’}
> // Переопределяем невиртуальный метод базового класса
> void PrintDimention(void) {cout << Rectangle PrintDimention << ‘\n’}
>};
>// Главная функция
>void main(void) {
> // Определяем объект порожденного класса
> Rectangle rectObject;
> // Определяем указатель на объект порожденного класса
> // и инициализируем его
> *Rectangle ptrRectObject = &rectObject;
> // Определяем указатель на объект базового класса Figure
> // и записываем в него адрес объекта порожденного класса.
> *Figure ptrFigObject = &rectObject;
> // Вызываем методы класса Rectangle, используя имя объекта
> rectObject.PrintName;
> rectObject.PrintDimention;
> cout << '\n';
> // Вызываем методы класса базового класса Figure
> rectObject.Figure::PrintName;
> rectObject.Figure::PrintDimention;
> cout << '\n';
> // Вызываем методы класса Rectangle, используя указатель на
> // объекты класса Rectangle
> ptrRectObject->PrintName;
> ptrRectObject->PrintDimention;
> cout << '\n';
> // Вызываем методы класса Rectangle, используя указатель на
> // объекты класса Figure
> ptrFigObject->PrintName;
> ptrFigObject->PrintDimention;
>}
Если вы запустите приведенную выше программу, она выведет на экран следующую информацию:
>Rectangle PrintName
>Rectangle PrintDimention
>Figure PrintName
>Figure PrintDimention
>Rectangle PrintName
>Rectangle PrintDimention
>Figure PrintName
>Figure PrintDimention
Абстрактные классы
Виртуальные методы могут быть объявлены как чисто виртуальные. Для этого после описания метода указывается специальный спецификатор (= 0). Он означает, что описанные методы не определены.
Класс в котором определен хотя бы один чисто виртуальный метод называется абстрактным. Нельзя создавать объекты абстрактного класса. Абстрактный класс может использоваться только в качестве базового класса для построения других классов.
Класс, порожденный от абстрактного класса, должен переопределять описанные в нем чисто виртуальные методы. В противном случае этот класс также будет абстрактным.