Читайте также:
|
|
Виртуальный означает видимый, но не существующий в реальности. Когда используется виртуальная ф-ия, прог-а которая вызывает ф-ию одного класса, может в этот момент вызывать ф-ию совсем другого класса. Абсолютно разные ф-ии выполняются с помощью одного и того же вывода. Это связано с полиморфизмом. Полиморфизм – различные формы. Чтобы использовать полиморфизм: 1. Все классы должны являться наследниками одного базового. 2. Ф-ия должна быть объявлена виртуальной (virtual) в базовом классе.
Рассмотрим программу:
class Base //Базовый класс
{
public:
virtual void show() //Виртуальная функция
{ cout << "Base\n"; }
};
class Derv1: public Base //Производный класс 1
{
public:
void show()
{ cout << "Derv1\n"; }
};
class Derv2: public Base //Производный класс 2
{
public:
void show()
{ cout << "Derv2\n"; }
};
int main()
{
Derv1 dv1; //Объект производного класса 1
Derv2 dv2; //Объект производного класса 2
Base* ptr; //Указатель на базовый класс
ptr = &dv1; //Адрес dv1 занести в указатель
ptr->show(); //Выполнить show()
ptr = &dv2; //Адрес dv2 занести в указатель
ptr->show(); //Выполнить show()
return 0;
}
Результат:
Derv1
Derv2
Базовый класс, который никогда на будет реализован, называется абстрактным классом. Он служит звеном для создания иерархической структуры классов. Объекты родительского класса не предназначены для реализации. Поэтому используют числовую виртуальную ф-ию. Это ф-ия, после объявления которой добавляется выражение =0.
virtual void show() = 0; //чистая виртуальная
0 не присваивается.
Деструкторы базового класса должны быть виртуальными.
Пр.:
class Base
{
public:
virtual ~Base() //виртуальный деструктор
{ cout << "Base удален\n"; }
};
class Derv: public Base
{
public:
~Derv()
{ cout << "Derv удален\n"; }
};
int main()
{
Base* pBase = new Derv;
delete pBase;
return 0;
}
Результат:
Derv удален
Base удален
Чтобы объекты порожденных классов удалялись правильно, следует всегда делать деструкторы в базовых классах виртуальными.
Дата добавления: 2015-08-17; просмотров: 62 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
Управление памятью. Операции new и delete. Указатель this. | | | Дружественные функции. |