Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.11.2014, 22:49   #1
shadezx
Пользователь
 
Регистрация: 24.10.2013
Сообщений: 75
По умолчанию Чисто виртуальные функции

Какие преимущества дает нам определение чисто виртуальных функций
в базовом классе?
например:
Код:
class Pet
{
public:
	virtual void speak() = 0;
	virtual void eat() = 0;
};
void Pet::eat(){ cout << "PEt::eat" << endl; }
void Pet::speak(){ cout << "Pet::speak" << endl; }

class Dog :public Pet
{
public:
	void speak()
	{ 
		cout << "Dog speak" << endl;
		//Pet::speak(); 
	}
	void eat()
	{
		//Pet::eat(); 
		cout << "Dog eat" << endl;
	}

};
shadezx вне форума Ответить с цитированием
Старый 22.11.2014, 23:42   #2
Zenon
Пользователь
 
Регистрация: 03.07.2014
Сообщений: 32
По умолчанию

Вы имеете в виду по сравнению с вот таким классом с функциями-заглушками?

Код:
class Pet
{
public:
	virtual void speak() {}
	virtual void eat() {}
};
Я бы сказал, что эти два варианта имеют разный смысл.

Вариант с чисто виртуальными функциями говорит:

"Класс Pet - незаконченный, вы не можете создавать объекты этого класса, вы должны наследовать от него новые классы, переопределять там вот эти конкретные функции и создавать объекты тех новых классов"

Компилятор будет ругаться, если вы забудете перегрузить функции или попробуете создать класс Pet

Вариант с заглушками говорит:

"Класс Pet - законченный, вы можете создавать объекты этого класса, вы не обязаны наследовать от него новые классы, переопределять там эти функции, но можете это сделать"

Функция-заглушка с пустым телом может иметь смысл. Например, функция rotate, которая поворачивает геометрическую фигуру на плоскости относительно центра фигуры для круга или для точки должна быть именно пустой, т.к. поворот круга вокруг центра - не запрещенное действие и дает тот же круг.
Zenon вне форума Ответить с цитированием
Старый 22.11.2014, 23:47   #3
shadezx
Пользователь
 
Регистрация: 24.10.2013
Сообщений: 75
По умолчанию

Цитата:
Сообщение от Zenon Посмотреть сообщение
Вы имеете в виду по сравнению с вот таким классом с функциями-заглушками?

Код:
class Pet
{
public:
	virtual void speak() {}
	virtual void eat() {}
};
Я бы сказал, что эти два варианта имеют разный смысл.

Вариант с чисто виртуальными функциями говорит:

"Класс Pet - незаконченный, вы не можете создавать объекты этого класса, вы должны наследовать от него новые классы, переопределять там вот эти конкретные функции и создавать объекты тех новых классов"

Компилятор будет ругаться, если вы забудете перегрузить функции или попробуете создать класс Pet

Вариант с заглушками говорит:

"Класс Pet - законченный, вы можете создавать объекты этого класса, вы не обязаны наследовать от него новые классы, переопределять там эти функции, но можете это сделать"

Функция-заглушка с пустым телом может иметь смысл. Например, функция rotate, которая поворачивает геометрическую фигуру на плоскости относительно центра фигуры для круга или для точки должна быть именно пустой, т.к. поворот круга вокруг центра - не запрещенное действие и дает тот же круг.
то что вы написали я понимаю, просто хочу узнать зачем нужно тело для чисто виртуальной функции, и что это нам дает?
shadezx вне форума Ответить с цитированием
Старый 23.11.2014, 00:06   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
зачем нужно тело для чисто виртуальной функции
Насколько я помню виртуальная функция в отличии от обычной перегружаемой должна быть обязательно описана в наследнике. т.е. это как бы шаблон-правила, который говорит "Обязательно сделай в себе такую-то функцию".
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 23.11.2014, 00:09   #5
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от shadezx Посмотреть сообщение
то что вы написали я понимаю, просто хочу узнать зачем нужно тело для чисто виртуальной функции, и что это нам дает?
Я хочу, что бы вы выполнили простую задачу:

Необходимо реализовать базовый класс, у которого есть только одна виртуальная функция-член, и это - его диструктор.

При этом необходимо реализовать диструктор "чисто-виртуальным", Потому что по замыслу запрещено создавать объекты базового класса.

Далее вам необходимо создать хотя бы одного потомка и заставить программу работать.

Если вы не определите туловище базового диструктора - ваш код не сможет работать.

Цитата:
Сообщение от Stilet Посмотреть сообщение
Насколько я помню виртуальная функция в отличии от обычной перегружаемой должна быть обязательно описана в наследнике. т.е. это как бы шаблон-правила, который говорит "Обязательно сделай в себе такую-то функцию".
Вероятно вы хотели сказать "чисто виртуальная функция в отличии от обычных виртуальных ..." ?

Последний раз редактировалось Stilet; 23.11.2014 в 00:18.
_Bers вне форума Ответить с цитированием
Старый 23.11.2014, 00:19   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Вероятно вы хотели сказать "чисто виртуальная функция в отличии от обычных виртуальных ..." ?
Может. Я потому и написал, что ссылаюсь на память. Если ошибаюсь - значит ошибаюсь. Сам лично я использую абстрактные классы, но оч. редко.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 27.11.2014, 18:05   #7
Zenon
Пользователь
 
Регистрация: 03.07.2014
Сообщений: 32
По умолчанию

Цитата:
Сообщение от shadezx Посмотреть сообщение
то что вы написали я понимаю, просто хочу узнать зачем нужно тело для чисто виртуальной функции, и что это нам дает?
У чисто виртуальной функции никакого тела нет (на что указывает "= 0")
Zenon вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
виртуальные функции igoreshka3333 Помощь студентам 3 01.10.2014 23:44
виртуальные функции zla9_kolu4ka Общие вопросы C/C++ 2 09.03.2014 03:19
виртуальные функции mixon-21 Помощь студентам 1 19.09.2013 21:56
Виртуальные функции studprog Помощь студентам 2 30.09.2012 21:00
Виртуальные функции bigory Помощь студентам 2 06.06.2009 22:44