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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 17.11.2011, 19:20   #1
JiryPK
Новичок
Джуниор
 
Регистрация: 17.11.2011
Сообщений: 3
По умолчанию виртуальная и чисто виртуальная функции

В чём разница между ними??? Как я понял, виртуальная определена в базовом классе, а чисто виртуальная нет. Можете посоветовать, где поподробнее почитать об этом, или хотя б скинуть пример.)
JiryPK вне форума Ответить с цитированием
Старый 17.11.2011, 19:45   #2
Son Of Pain
Участник клуба
 
Регистрация: 23.12.2010
Сообщений: 1,129
По умолчанию

Разница в надписи =0 справа

1) Чисто виртуальную функцию можно не определять в базовом классе.
2) Объект класса, у которого есть хотя бы одна чисто виртуальная функция, создать не получится (абстрактный класс).
Больше разницы никакой.
Son Of Pain вне форума Ответить с цитированием
Старый 17.11.2011, 19:49   #3
JiryPK
Новичок
Джуниор
 
Регистрация: 17.11.2011
Сообщений: 3
По умолчанию

т.е. если я в программе
Код:
#include <iostream>
using namespace std;
class base
{
public:
	virtual void who()
	{
		cout<<"базовый класс.\n";
	}
};
class first_d:public base
{
public: 	
	void who()
	{
		cout<<"первый производный класс.\n";
	}
};
class second_d: public base
{
public:
	void who()
	{
		cout<<"второй производный класс.\n"
	}
};
int main()
{
base base_obj;
base *p;
first_d first_obj;
second_d second_obj;

p=&base_obj;
p->who();

p=&first_obj;
p->who();

p=&second_obj;
p->who();

return 0;
}
у строчки virtual void who() напишу =0, то она станет чисто виртуальной?

Последний раз редактировалось JiryPK; 17.11.2011 в 19:55. Причина: неточность
JiryPK вне форума Ответить с цитированием
Старый 17.11.2011, 19:55   #4
JiryPK
Новичок
Джуниор
 
Регистрация: 17.11.2011
Сообщений: 3
По умолчанию

ну и уберу тело функции who, чтоб она не определялась
JiryPK вне форума Ответить с цитированием
Старый 17.11.2011, 20:17   #5
Son Of Pain
Участник клуба
 
Регистрация: 23.12.2010
Сообщений: 1,129
По умолчанию

Да. Только строчка
Код:
base base_obj;
не скомпилируется тогда.
Son Of Pain вне форума Ответить с цитированием
Старый 18.11.2011, 00:38   #6
Сыроежка
Форумчанин
 
Регистрация: 01.07.2011
Сообщений: 423
По умолчанию

Цитата:
Сообщение от JiryPK Посмотреть сообщение
В чём разница между ними??? Как я понял, виртуальная определена в базовом классе, а чисто виртуальная нет. Можете посоветовать, где поподробнее почитать об этом, или хотя б скинуть пример.)
Сначала целесообразно определить понятие абстрактного класса.
Абстрактный класс - это класс, который может использоваться только в качестве базового класса некоторого другого класса. Объекты абстрактного класса не могут быть созданы за исключением их создания в качестве подъобектов производного класса.
Класс является абстрактным, если он имеет по крайней мере одну чисто виртуальную функцию.
Виртуальная функция считается чисто виртуальной, если она объявлена со спецификатором чисто виртуальной функции. Чисто виртуальная функция должна быть определена только в том случае, если она явно вызывается из производного класса с указанием квалифицированного имени.

Например,

Код:
class Shape
{
public:
   virtual ~Shape() = 0;
   virtual void draw() const = 0;
};

Shape::~Shape() {}
Этот класс абстрактный, так как имеет по крайней мере одну виртуальную функцию. В данном случае в нем объявлены две виртуальные функции: деструктор и функция-член draw При этом деструктор к тому же опредеен, так как деструктор базового класса, всегда вызывается в производном классе.

Функция draw может быть определена в производном классе. Если производный класс не переопределяет все чисто виртуальные функции, то он также является абстрактным классом.

Можно в любой класс, даже если он сам является производным классом включать чисто виртуальные функции. Тогда он становится абстрактным, не смотря на то, что его базовый класс не является абстрактным.
Со мной можно встретиться на www.clipper.borda.ru
Сыроежка вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Виртуальная клавиатура mobilitialex Общие вопросы Delphi 12 18.05.2012 00:13
Виртуальная память ordoss Общие вопросы C/C++ 1 12.01.2011 18:00
Виртуальная функция в С++ MrJenika Помощь студентам 6 04.01.2010 18:12
- Что есть вообще виртуальная операционка? - Для каких целей она нужна? Alex Cones Операционные системы общие вопросы 7 24.12.2009 22:54
виртуальная функция? SERGOO Общие вопросы C/C++ 4 18.09.2007 21:43