Модераторы: 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   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
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.1125 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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