![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| Sergio |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 843 Регистрация: 28.7.2006 Где: Solar System-> Earth Репутация: 0 Всего: 1 |
Здраствуйте. Для чего нужны Виртуальные классы и функции?? А понял как их создавать, но не пойму зачем они нужны. Розкажите на примере. Спасибо.
|
|||
|
||||
| Kuvaldis |
|
|||
![]() механик-вредитель ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1189 Регистрация: 16.6.2006 Где: Минск Репутация: 11 Всего: 61 |
Sergio,
В коде базовый класс Mammal и два производных Dog и Cat. Делаем виртуальный метод Speak(), который действует по-разному для каждого класса. В программе создаем массив из указателей на базовый класс. Потом выделяем из память под объекты любого из этих классов. Чтобы заставить потом эти объекты "говорить", совершенно не обязательно узнавать, какого типа указатель в массиве и вызвать соответствующий метод. Механизм виртуальных функций позволяет просто написать pMammal[i]->Speak(); А нужный метод вызовется автоматически.
-------------------- Помни - когда ты спишь, враг не дремлет Спи чаще и дольше, изматывай врага бессоницей |
|||
|
||||
| Romikgy |
|
|||
![]() Любитель-программер ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7326 Регистрация: 11.5.2005 Где: Porto Franco Odes sa Репутация: 8 Всего: 146 |
имхо в классах
и слово виртуал не нужно -------------------- Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. |
|||
|
||||
| sergejzr |
|
|||
![]() Un salsero Профиль Группа: Админ Сообщений: 13285 Регистрация: 10.2.2004 Где: Германия г .Ганновер Репутация: 19 Всего: 360 |
Если ты точно знаешь, что классы наследоваться не будут. Например сиамская кошка или персидская, овчарка, или болонка |
|||
|
||||
| Kuvaldis |
|
|||
![]() механик-вредитель ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1189 Регистрация: 16.6.2006 Где: Минск Репутация: 11 Всего: 61 |
Romikgy,
согласен не нужно. И если его не поставить, все равно во всех производных классах этот метод Speak() останется витруальным. Но по правилам хорошего тона слово virtual нужно написать. + лишнее (?) напоминание в глубоко вложенных наследниках, что данный метод является виртуальным -------------------- Помни - когда ты спишь, враг не дремлет Спи чаще и дольше, изматывай врага бессоницей |
|||
|
||||
| Romikgy |
|
|||
![]() Любитель-программер ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7326 Регистрация: 11.5.2005 Где: Porto Franco Odes sa Репутация: 8 Всего: 146 |
А разве один раз ф_ция описаная как виртуальная не остается таковой у детей? Добавлено @ 19:18 такого не слышал -------------------- Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. |
|||
|
||||
| Kuvaldis |
|
|||
![]() механик-вредитель ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1189 Регистрация: 16.6.2006 Где: Минск Репутация: 11 Всего: 61 |
Romikgy,
Джесс Либерти "С++ за 21 день". Глава про виртуальные функции. + По-моему, это есть и в Дейтеле. -------------------- Помни - когда ты спишь, враг не дремлет Спи чаще и дольше, изматывай врага бессоницей |
|||
|
||||
| Daevaorn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2155 Регистрация: 29.11.2004 Где: Москва Репутация: 51 Всего: 70 |
||||
|
||||
| Romikgy |
|
|||
![]() Любитель-программер ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7326 Регистрация: 11.5.2005 Где: Porto Franco Odes sa Репутация: 8 Всего: 146 |
с каких пор такие книги стали верхом стилизма? Добавлено @ 19:27 кто сказал? PS так для ся интересуюсь -------------------- Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. |
|||
|
||||
| sergejzr |
|
|||
![]() Un salsero Профиль Группа: Админ Сообщений: 13285 Регистрация: 10.2.2004 Где: Германия г .Ганновер Репутация: 19 Всего: 360 |
Romikgy, да, ты прав. Спасибо.
|
|||
|
||||
| Romikgy |
|
|||
![]() Любитель-программер ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7326 Регистрация: 11.5.2005 Где: Porto Franco Odes sa Репутация: 8 Всего: 146 |
-------------------- Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. |
|||
|
||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 53 Всего: 183 |
Кто бы не говорил, это действительно полезно - особенно когда копаешься в чужом коде или своем, но старом. -------------------- ... |
|||
|
||||
| Romikgy |
|
|||
![]() Любитель-программер ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7326 Регистрация: 11.5.2005 Где: Porto Franco Odes sa Репутация: 8 Всего: 146 |
здесь не спорю!!!! но имхо это не а удобство для себя и других кому отдаешь код!!!! -------------------- Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. |
|||
|
||||
| EvgenZ |
|
|||
![]() Freedom in me ![]() ![]() Профиль Группа: Участник Сообщений: 407 Регистрация: 3.8.2006 Репутация: 1 Всего: 11 |
Так создание комфорта себе и окружающим и есть хороший тон
-------------------- <удалено администрацией форума> |
|||
|
||||
| Romikgy |
|
|||
![]() Любитель-программер ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7326 Регистрация: 11.5.2005 Где: Porto Franco Odes sa Репутация: 8 Всего: 146 |
имхо не всегда! мне лично не сильно нравится писать лишние букофки в коде, то бишь мне это не комфортно! отсель вывод , это не хороший тон PS а вообще хороший и не хороший это дело относительное, так что смысл спора ушел в зрительный зал, я заканчиваю в этой теме. -------------------- Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. |
|||
|
||||
| Daevaorn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2155 Регистрация: 29.11.2004 Где: Москва Репутация: 51 Всего: 70 |
Ага, а потом в службу поддерки твоей компании будут названивать программисты, которым не посчастливилось использоваь твой код(ну допустим, ты библиотеку классов писал), с разными вопросами. Начальство за это не похвалит. Не кто не будет лазить по файлам(если ты предоставил подробную документацию, конечно) и искать базовый класс, в который метод foo() помечен как виртуальный. Обычно после таких случаев, в стандартах кодирования компании появляется пунт об обязятельном указании полной сигнатуры метода в объявлении класса. |
|||
|
||||
| SparF |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 387 Регистрация: 14.9.2006 Где: Санкт-Петербург/М осква Репутация: нет Всего: 18 |
В свое время прочитал книгу Шилдта "Полный справочник по с++", к сожалению, много писать на с++ не пришлось - стояли другие задачи. Однако в блокнотике остались кое-какие записи (пардон, если в чем-то повторюсь, просто хочется собрать инфу в одном месте и подвести своего рода итог):
Виртуальные функции: - функция-член, объявляемая в базовом классе и переопределяемая в производном; - перед ее определением в базовом классе ставится virtual - в базовом классе - определяется тип интерфейса; - переопределение в производном классе создает конкретный метод; - если указатель на объект базового класса устанавливается на объек производного класса, содержащий виртуальную функцию, то выбор требуемой функции основывается на типе объекта, на который ссылается указатель, причем этот выбор осуществляется в ходе выполнения программы. Т.о. если указатель ссылается на объекты разных типов, то будут вызываться разные виртуальные функции. Это относится и к ссылкам на объекты. - могут вызываться и как обычные функции, однако при этом их "особые свойства теряются". - прототип переопределяемой функции должен совпадать с прототипом в базовом классе; - виртуальная функция не может быть статической или дружественной; - конструкторы не могут быть виртуальными, на деструкторы это ограничение не распространяется; - для переопределения вирт. функции в производном классе используется термин "замещение"; - атрибут virtual наследуется; - виртуальные функции являются "иерархическими", т.е. виртуальную функцию не обязательно замещать, в этом случае вызывается функция, определяемая в базовом классе. Чисто виртуальная функция - виртуальная функция, не имеющая определения в базовом классе; - для ее объявления используется
это объявление просто задает интерфейс, не больше; - класс, содержащий хотя бы одну виртуальную функцию называется абстрактным - его объекты создать не возможно, и использовать его можно лишь как основу для производных классов, однако на него можно создавать ссылки и указатели. - абстрактные классы и виртуальные функции позволяют создавать библиотеки классов, носящие обобщенный характер. -------------------- Люди, не пользуйтесь пиратским программным обеспечением - переходите на Linux! |
|||
|
||||
| Kuvaldis |
|
|||
![]() механик-вредитель ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1189 Регистрация: 16.6.2006 Где: Минск Репутация: 11 Всего: 61 |
SparF,
Можно создать виртуальный метод Clone(), который и будет выполнять роль виртуального конструктора (про это в Страуструпе есть -------------------- Помни - когда ты спишь, враг не дремлет Спи чаще и дольше, изматывай врага бессоницей |
|||
|
||||
| 0x07L |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 272 Регистрация: 10.6.2006 Где: Москва Репутация: нет Всего: 5 |
Есть допущение относительно возвращаемого значения. Вот выдержка из черновика стандарта С++ от 19.10.2005 (здесь когда-то скачивал):
|
||||
|
|||||
| Sergio |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 843 Регистрация: 28.7.2006 Где: Solar System-> Earth Репутация: 0 Всего: 1 |
Kuvaldis, я вставил твой код, но компилятор просит библиотеку какую-то
Это сообщение отредактировал(а) Sergio - 17.10.2006, 18:16 |
|||
|
||||
| JackYF |
|
|||
![]() полуавантюрист ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 5814 Регистрация: 28.8.2004 Где: страна тысячи озё р Репутация: 18 Всего: 162 |
Sergio, может, скажешь какую?
|
|||
|
||||
| EvgenZ |
|
|||
![]() Freedom in me ![]() ![]() Профиль Группа: Участник Сообщений: 407 Регистрация: 3.8.2006 Репутация: 1 Всего: 11 |
Странно, какая там библиотека может быть... там даже и не используется ничего.
-------------------- <удалено администрацией форума> |
|||
|
||||
| Rockie |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1143 Регистрация: 23.4.2006 Репутация: 8 Всего: 31 |
возможно:
-------------------- Чтобы иметь большой гардероб - надо иметь большой гардероб. |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |