Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Для чего нужны Виртуальные классы и функции?? 
:(
    Опции темы
Sergio
Дата 3.10.2006, 12:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 843
Регистрация: 28.7.2006
Где: Solar System-> Earth

Репутация: 0
Всего: 1



Здраствуйте. Для чего нужны Виртуальные классы и функции?? А понял как их создавать, но не пойму зачем они нужны. Розкажите на примере. Спасибо.  smile 
PM MAIL ICQ   Вверх
Kuvaldis
Дата 3.10.2006, 17:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


механик-вредитель
***


Профиль
Группа: Участник Клуба
Сообщений: 1189
Регистрация: 16.6.2006
Где: Минск

Репутация: 11
Всего: 61



Sergio, 
В коде базовый класс Mammal и два производных Dog и Cat.
Делаем виртуальный метод Speak(), который действует по-разному для каждого класса.
В программе создаем массив из указателей на базовый класс.
Потом выделяем из память под объекты любого из этих классов.
Чтобы заставить потом эти объекты "говорить", совершенно не обязательно узнавать, какого типа указатель в массиве и вызвать соответствующий метод. Механизм виртуальных функций позволяет просто написать
 pMammal[i]->Speak();

А нужный метод вызовется автоматически.


Код

//---------------------------------------------------------------------------
#include <iostream>
//---------------------------------------------------------------------------
#pragma hdrstop
#pragma argsused 
//---------------------------------------------------------------------------
enum ANIMAL { MAMMAL, DOG, CAT };
using namespace std;
//---------------------------------------------------------------------------
class Mammal
{
  public:
     virtual void Speak() const { cout << "Mammal sound" << endl; }
};
//---------------------------------------------------------------------------
class Dog: public Mammal
{
  public:
     virtual void Speak() const { cout << "Woof!!!" << endl; }
};
//---------------------------------------------------------------------------
class Cat: public Mammal
{
  public:  
     virtual void Speak() const { cout << "Meow!!!" << endl; }
};
//---------------------------------------------------------------------------
int main(int argc, char* argv[])
{
    int   i, choice;
    const int  count = 5;
    Mammal* pMammal[count];

    for(i = 0; i < count; i++)
    {
       cout << " 1 - DOG, 2 - CAT, 3 - MAMMAL" << endl;
       cin >> choice;
       switch (choice)
       {
           case DOG: pMammal[i] = new Dog;
                     break;
           case CAT: pMammal[i] = new Cat;
                     break;
            default: pMammal[i] = new Mammal;
                     break;
       }
    }
    for(i = 0; i < count; i++)
        pMammal[i]->Speak();


    delete [] pMammal;
    cin >> i;
    return 0;
}
//---------------------------------------------------------------------------



--------------------
Помни - когда ты спишь, враг не дремлет
Спи чаще и дольше, изматывай врага бессоницей
PM MAIL ICQ   Вверх
Romikgy
Дата 3.10.2006, 19:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 8
Всего: 146



имхо в классах 
Цитата(Kuvaldis @  3.10.2006,  16:16 Найти цитируемый пост)
Dog

и
Цитата(Kuvaldis @  3.10.2006,  16:16 Найти цитируемый пост)
Cat

слово виртуал не нужно  smile 




--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
sergejzr
Дата 3.10.2006, 19:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

Репутация: 19
Всего: 360



Цитата(Romikgy @  3.10.2006,  17:03 Найти цитируемый пост)
имхо в классах 
Цитата(Kuvaldis @  3.10.2006,  16:16 Найти цитируемый пост)
Dog

и
Цитата(Kuvaldis @  3.10.2006,  16:16 Найти цитируемый пост)
Cat

слово виртуал не нужно  smile 



Если ты точно знаешь, что классы наследоваться не будут. Например сиамская кошка или персидская, овчарка, или болонка smile



--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
Kuvaldis
Дата 3.10.2006, 19:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


механик-вредитель
***


Профиль
Группа: Участник Клуба
Сообщений: 1189
Регистрация: 16.6.2006
Где: Минск

Репутация: 11
Всего: 61



Romikgy, 
Цитата

слово виртуал не нужно   

согласен не нужно. И если его не поставить, все равно во всех производных классах этот метод Speak() останется витруальным. Но по правилам хорошего тона слово virtual нужно написать. + лишнее (?) напоминание в глубоко вложенных наследниках, что данный метод является виртуальным 


--------------------
Помни - когда ты спишь, враг не дремлет
Спи чаще и дольше, изматывай врага бессоницей
PM MAIL ICQ   Вверх
Romikgy
Дата 3.10.2006, 19:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 8
Всего: 146



Цитата(sergejzr @  3.10.2006,  18:11 Найти цитируемый пост)
Если ты точно знаешь, что классы наследоваться не будут. 

А разве один раз ф_ция описаная как виртуальная не остается таковой у детей?

Добавлено @ 19:18 
Цитата(Kuvaldis @  3.10.2006,  18:16 Найти цитируемый пост)
Но по правилам хорошего тона слово virtual нужно написать

такого не слышал smile кем этот хороший тон высказан ?


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
Kuvaldis
Дата 3.10.2006, 19:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


механик-вредитель
***


Профиль
Группа: Участник Клуба
Сообщений: 1189
Регистрация: 16.6.2006
Где: Минск

Репутация: 11
Всего: 61



Romikgy, 
Цитата

такого не слышал  кем этот хороший тон высказан ?

Джесс Либерти "С++ за 21 день". Глава про виртуальные функции. + По-моему, это есть и в Дейтеле.


--------------------
Помни - когда ты спишь, враг не дремлет
Спи чаще и дольше, изматывай врага бессоницей
PM MAIL ICQ   Вверх
Daevaorn
Дата 3.10.2006, 19:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

Репутация: 51
Всего: 70



Цитата(Romikgy @  3.10.2006,  20:17 Найти цитируемый пост)
Если ты точно знаешь, что классы наследоваться не будут. 


А разве один раз ф_ция описаная как виртуальная не остается таковой у детей? 

Всего лишь правило хорошего тона - писать virtual
PM MAIL WWW   Вверх
Romikgy
Дата 3.10.2006, 19:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 8
Всего: 146



Цитата(Kuvaldis @  3.10.2006,  18:20 Найти цитируемый пост)
Джесс Либерти "С++ за 21 день"

с каких пор такие книги стали верхом стилизма? smile

Добавлено @ 19:27 
Цитата(Daevaorn @  3.10.2006,  18:21 Найти цитируемый пост)
Всего лишь правило хорошего тона 

кто сказал?
PS так для ся интересуюсь


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
sergejzr
Дата 3.10.2006, 19:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

Репутация: 19
Всего: 360



Romikgy, да, ты прав. Спасибо.


--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
Romikgy
Дата 3.10.2006, 19:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 8
Всего: 146



Цитата(sergejzr @  3.10.2006,  18:43 Найти цитируемый пост)
Спасибо. 

дык я вроде ничего и не делал smile


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
Earnest
Дата 4.10.2006, 07:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 53
Всего: 183



Цитата(Romikgy @  3.10.2006,  20:25 Найти цитируемый пост)
кто сказал?

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




--------------------
...
PM   Вверх
Romikgy
Дата 4.10.2006, 08:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 8
Всего: 146



Цитата(Earnest @  4.10.2006,  06:06 Найти цитируемый пост)
это действительно полезно

здесь не спорю!!!! но имхо это не
Цитата(Kuvaldis @  3.10.2006,  18:16 Найти цитируемый пост)
правилам хорошего тона

а удобство для себя и других кому отдаешь код!!!!


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
EvgenZ
Дата 4.10.2006, 09:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Freedom in me
**


Профиль
Группа: Участник
Сообщений: 407
Регистрация: 3.8.2006

Репутация: 1
Всего: 11



Так создание комфорта себе и окружающим и есть хороший тон  smile . 


--------------------
<удалено администрацией форума>
PM MAIL   Вверх
Romikgy
Дата 4.10.2006, 09:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 8
Всего: 146



Цитата(EvgenZ @  4.10.2006,  08:48 Найти цитируемый пост)
Так создание комфорта себе и окружающим и есть хороший тон 

имхо не всегда!
мне лично не сильно нравится писать лишние букофки в коде, то бишь мне это не комфортно! отсель вывод , это не хороший тон  smile 
PS а вообще хороший и не хороший это дело относительное, так что смысл спора ушел в зрительный зал, я заканчиваю в этой теме.


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
Daevaorn
Дата 4.10.2006, 12:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

Репутация: 51
Всего: 70



Цитата(Romikgy @  4.10.2006,  10:56 Найти цитируемый пост)
Цитата(EvgenZ @  4.10.2006,  08:48 )
Так создание комфорта себе и окружающим и есть хороший тон 


имхо не всегда!
мне лично не сильно нравится писать лишние букофки в коде, то бишь мне это не комфортно! отсель вывод , это не хороший тон   
PS а вообще хороший и не хороший это дело относительное, так что смысл спора ушел в зрительный зал, я заканчиваю в этой теме. 

Ага, а потом в службу поддерки твоей компании будут названивать программисты, которым не посчастливилось использоваь твой код(ну допустим, ты библиотеку классов писал), с разными вопросами. Начальство за это не похвалит. Не кто не будет лазить по файлам(если ты предоставил  подробную документацию, конечно) и искать базовый класс, в который метод foo() помечен как виртуальный. Обычно после таких случаев, в стандартах кодирования компании появляется пунт об обязятельном указании полной сигнатуры метода в объявлении класса.
PM MAIL WWW   Вверх
SparF
Дата 4.10.2006, 12:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 387
Регистрация: 14.9.2006
Где: Санкт-Петербург/М осква

Репутация: нет
Всего: 18



В свое время прочитал книгу Шилдта "Полный справочник по с++", к сожалению, много писать на с++ не пришлось - стояли другие задачи. Однако в блокнотике остались кое-какие записи (пардон, если в чем-то повторюсь, просто хочется собрать инфу в одном месте и подвести своего рода итог):
Виртуальные функции:
- функция-член, объявляемая в базовом классе и переопределяемая в производном;
- перед ее определением в базовом классе ставится virtual
- в базовом классе - определяется тип интерфейса;
- переопределение в производном классе создает конкретный метод;
- если указатель на объект базового класса устанавливается на объек производного класса, содержащий виртуальную функцию,  то выбор требуемой функции основывается на типе объекта, на который ссылается указатель, причем этот выбор осуществляется в ходе выполнения программы. Т.о. если указатель ссылается на объекты разных типов, то будут вызываться разные виртуальные функции. Это относится и к ссылкам на объекты.
- могут вызываться и как обычные функции, однако при этом их "особые свойства теряются".
- прототип переопределяемой функции должен совпадать с прототипом в базовом классе;
- виртуальная функция не может быть статической или дружественной;
- конструкторы не могут быть виртуальными, на деструкторы это ограничение не распространяется;
- для переопределения вирт. функции в производном классе используется термин "замещение";
- атрибут virtual наследуется;
- виртуальные функции являются "иерархическими", т.е. виртуальную функцию не обязательно замещать, в этом случае вызывается функция, определяемая в базовом классе.
Чисто виртуальная функция
- виртуальная функция, не имеющая определения в базовом классе;
- для ее объявления используется 
Код

virtual тип имя  (список_параметров) = 0;

это объявление просто задает интерфейс, не больше;
- класс, содержащий хотя бы одну виртуальную функцию называется абстрактным - его объекты создать не возможно, и использовать его можно лишь как основу для производных классов, однако на него можно создавать ссылки и указатели.
- абстрактные классы и виртуальные функции позволяют создавать библиотеки классов, носящие обобщенный характер.


--------------------
Люди, не пользуйтесь пиратским программным обеспечением - переходите на Linux!
PM MAIL ICQ   Вверх
Kuvaldis
Дата 4.10.2006, 14:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


механик-вредитель
***


Профиль
Группа: Участник Клуба
Сообщений: 1189
Регистрация: 16.6.2006
Где: Минск

Репутация: 11
Всего: 61



SparF, 
Цитата

- конструкторы не могут быть виртуальными,

Можно создать виртуальный метод Clone(), который и будет выполнять роль виртуального конструктора (про это в Страуструпе есть smile 


--------------------
Помни - когда ты спишь, враг не дремлет
Спи чаще и дольше, изматывай врага бессоницей
PM MAIL ICQ   Вверх
0x07L
Дата 4.10.2006, 16:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 272
Регистрация: 10.6.2006
Где: Москва

Репутация: нет
Всего: 5



Цитата(SparF @  4.10.2006,  13:56 Найти цитируемый пост)
прототип переопределяемой функции должен совпадать с прототипом в базовом классе

Есть допущение относительно возвращаемого значения. Вот выдержка из черновика стандарта С++ от 19.10.2005 (здесь когда-то скачивал):
Цитата

The return type of an overriding function shall be either identical to the return type of the overridden function or covariant with the classes of the functions. If a function D::f overrides a function B::f, the return types of the functions are covariant if they satisfy the following criteria:
— both are pointers to classes or references to classes
— the class in the return type of B::f is the same class as the class in the return type of D::f,or is an unambiguous
 and accessible direct or indirect base class of the class in the return type of D::f
— both pointers or references have the same cv-qualification and the class type in the return type of D::f has the same cv-qualification as or less cv-qualification than the class type in the return type of B::f


PM MAIL   Вверх
Sergio
Дата 17.10.2006, 18:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 843
Регистрация: 28.7.2006
Где: Solar System-> Earth

Репутация: 0
Всего: 1



Kuvaldis, я вставил твой код, но компилятор просит библиотеку какую-то smile 

Это сообщение отредактировал(а) Sergio - 17.10.2006, 18:16
PM MAIL ICQ   Вверх
JackYF
Дата 17.10.2006, 18:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 18
Всего: 162



Sergio, может, скажешь какую?


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
EvgenZ
Дата 17.10.2006, 21:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Freedom in me
**


Профиль
Группа: Участник
Сообщений: 407
Регистрация: 3.8.2006

Репутация: 1
Всего: 11



Странно, какая там библиотека может быть...  там даже и не используется ничего.


--------------------
<удалено администрацией форума>
PM MAIL   Вверх
Rockie
Дата 17.10.2006, 23:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1143
Регистрация: 23.4.2006

Репутация: 8
Всего: 31



возможно: 
Цитата
fatal error C1010: unexpected end of file while looking for precompiled header. Did you forget to add '#include "stdafx.h"' to your source?



--------------------
Чтобы иметь большой гардероб - надо иметь большой гардероб.
PM   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.2737 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.