пошук, категорії та ін. показати ▼

Абстрактні класи

Абстрактні класи
автор опубліковано

Ця стаття присвячена опису абстрактних класів, чисто віртуальних функцій, а також використанню чисто віртуальних функцій у випадку, коли вони мають тіло.
Віртуальна функція, яка не має тіла, називається чистою (pure), і оголошується наступним чином:

virtual тип ім'я (параметри) =0;

Мається на увазі, що дана функція буде реалізована в класах-нащадках.

class Base			                // абстрактний клас
  {
    protected:
    float a;		                // член абстрактного класу
    public:	
      virtual void display() = 0;        // чиста віртуальна функція
  };

class Derive				             // похідний клас, вже не абстрактний
  {
    float b;
    public:
      void display() {cout<<a<<endl<<b;};	// успадкована віртуальна функція, вже з тілом
  };

Клас, в якому є хоча б одна чиста віртуальна функція, називається абстрактним класом. Об'єкти абстрактного класу створювати заборонено – навіть операцією new. І при передачі параметра в функцію неможливо передати об'єкт абстрактного класу по значенню. Однак, вказівники (і посилання) визначати можна.

При успадкуванні абстрактність зберігається: якщо клас-нащадок не реалізує успадковану чисту віртуальну функцію, то він також буде абстрактним. В C++ абстрактний клас визначає поняття інтерфейсу. Успадкування від абстрактного класу – це успадкування інтерфейсу.

class Base					// абстрактний клас
	{
	protected:
		float a;				// член абстрактного класу
	public:	
		virtual void display() = 0;		// чиста віртуальна функція
	};

class Derive					// похідний клас, все одно буде абстрактним,
	{					// тому що чиста віртуальна функція display()
	float b;					// успадковується
	};

Зазвичай, користувачі вважають, що чиста віртуальна функція обов'язково мусить не мати тіла. Але це не так. Вона може мати тіло, при цьому залишаючись чистою. І в нащадках також.

Чисті віртуальні методи можна визначати, тобто вони можуть мати тіло. Клас, для якого це визначення написано, все одно є абстрактним класом. Навіть визначена в базовому класі чиста віртуальна функція успадковується як чиста, тому клас-нащадок теж буде абстрактним при відсутності власного визначення.

class Base					// абстрактний клас, хоча в чисто віртуальної 
	{					// функції вже є тіло
	protected:
		float a;				// член абстрактного класу
	public:	
		virtual void display() = 0;		// чиста віртуальна функція
	};

void Base::display()					// визначення чисто віртуальної функції
	{
	cout<<a;
	}

class Derive					// похідний клас, все одно абстрактний
	{					// незважаючи на те, що в базовому класі 
	float b;					// чисто віртуальна функція display() має тіло 
	};					// вона успадковується як чиста 

В визначенні чистого віртуального методу базового класу задається загальний код, який можуть використовувати класи-нащадки в своїх реалізаціях цієї функції. При цьому чистий метод базового класу викликається статично з префіксом класу.

class Base					// абстрактний клас
	{
	protected:
		float a;				// член абстрактного класу
	public:	
		virtual void display() = 0;		// чиста віртуальна функція
	};

void Base::display()					// визначення чисто віртуальної функції
	{
	cout<<a;
	}

class Derive					// похідний клас, вже не абстрактний
	{
	float b;
	public:
		void display()   			// успадкована віртуальна функція, вже з тілом
			{
			Base::display();		// статичний виклик через префікс класу
			cout<<endl<<b;
			};			
	};

Теоретичний матеріал і багато прикладних задач можна знайти в відомому посібнику

За матеріалами:
Лаптев В.В. С++. Объектно-ориентированное программирование. Задачи и упражнения / В.В. Лаптев, А.В. Морозова, А.В. Бокова. – СПб.: Питер, 2007. – 288 с.

схоже за тегами

Коментарів 3

  1. Ірина пише: Відповіcти

    мені дуже сподобався сайт! головне-чітко описано що і куди! навіть вказана додаткова література !) крутий сайт))

    • isBlog пише:

      Дякуємо. Будемо і далі старатись писати корисну і цікаву інформацію.
      Підписуйтесь на оновлення блогу, щоб бути в курсі останніх новин.

  2. Ігор пише: Відповіcти

    Дякую за інформацію, все описано дуже гарно і головне зрозуміло!)
    Продовжуйте у тому ж дусі!)

Залишити коментар:

Яндекс цитирования UA TOP Bloggers