Объектно-ориентированное программирование. Сивохин А.В - 49 стр.

UptoLike

49
порожденном классе. Если функция была определена как virtual в базовом классе,
то все функции порожденных классов, имеющие то же имя, тип и список
аргументов автоматически считаются виртуальными.
Если класс содержит хоть одну функцию, собственную или унаследованную,
описанную с ключевым словом virtual, то в такой класс компилятор добавит
скрытый элемент - указатель на
таблицу виртуальных функций. С помощью этой
таблицы при обращении к виртуальной функции можно выбрать именно тот код,
который соответствует объекту конкретного типа. Поскольку выбор необходимой
версии функции происходит на стадии выполнения, то говорят о позднем
связывании (late binding).
Конструкторы класса не могут быть описаны как виртуальные, для
деструкторов это допускается. Виртуальные
функции обязательно являются
элементами классов, но не статическими.
"Чистыми" виртуальными называются такие виртуальные функции, которые не
имеют реализации, их код не существует. Чтобы объявить виртуальную функцию
как "чистую", необходимо после описания заголовка функции указать знак
присваивания и нуль.
Абстрактные классы
Абстрактным называется класс, имеющий по крайней мере одну "чистую"
виртуальную
функцию. Абстрактный класс может использоваться только как
базовый класс для других классов, создавать объекты такого класса нельзя. Как и
все прочие классы, абстрактный класс имеет конструкторы и деструктор.
Абстрактный класс не может быть типом аргумента функции или возвращаемого
значения. Однако можно описывать указатели и ссылки на такой класс.
Классы, порождаемые от
абстрактного, рассматриваются как его уточнение. В
порожденном классе все "чистые" виртуальные функции базового класса должны
быть определены, либо объявлены как "чистые". Функции-элементы класса могут
быть вызваны из конструктора абстрактного класса, но вызов "чистой" виртуальной
функции вызовет ошибку периода исполнения.
Пример:
class shape {
public:
virtual void rotate (int)=0; // "чистые" виртуальные
//функции.
virtual void draw ()=0;
virtual void hilite()=0;
};
class circle: public shape
                                                                              49
порожденном классе. Если функция была определена как virtual в базовом классе,
то все функции порожденных классов, имеющие то же имя, тип и список
аргументов автоматически считаются виртуальными.
    Если класс содержит хоть одну функцию, собственную или унаследованную,
описанную с ключевым словом virtual, то в такой класс компилятор добавит
скрытый элемент - указатель на таблицу виртуальных функций. С помощью этой
таблицы при обращении к виртуальной функции можно выбрать именно тот код,
который соответствует объекту конкретного типа. Поскольку выбор необходимой
версии функции происходит на стадии выполнения, то говорят о позднем
связывании (late binding).
    Конструкторы класса не могут быть описаны как виртуальные, для
деструкторов это допускается. Виртуальные функции обязательно являются
элементами классов, но не статическими.
    "Чистыми" виртуальными называются такие виртуальные функции, которые не
имеют реализации, их код не существует. Чтобы объявить виртуальную функцию
как "чистую", необходимо после описания заголовка функции указать знак
присваивания и нуль.

                             Абстрактные классы
    Абстрактным называется класс, имеющий по крайней мере одну "чистую"
виртуальную функцию. Абстрактный класс может использоваться только как
базовый класс для других классов, создавать объекты такого класса нельзя. Как и
все прочие классы, абстрактный класс имеет конструкторы и деструктор.
Абстрактный класс не может быть типом аргумента функции или возвращаемого
значения. Однако можно описывать указатели и ссылки на такой класс.
    Классы, порождаемые от абстрактного, рассматриваются как его уточнение. В
порожденном классе все "чистые" виртуальные функции базового класса должны
быть определены, либо объявлены как "чистые". Функции-элементы класса могут
быть вызваны из конструктора абстрактного класса, но вызов "чистой" виртуальной
функции вызовет ошибку периода исполнения.
    Пример:
    class shape {
       public:
       virtual void rotate (int)=0; // "чистые" виртуальные
                                    //функции.
       virtual void draw ()=0;
       virtual void hilite()=0;
       };
    class circle: public shape