![]() |
|
Модераторы: bsa |
![]()
|
|
| Graf_h |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 482 Регистрация: 18.10.2007 Где: г. Ровно, Украина Репутация: нет Всего: 5 |
Росскажите пожалуйста для чего эта штука! кто ее использовал, можно ли обойтись без этого?
-------------------- Иногда переменная - это просто переменная |
|||
|
||||
| Alek86 |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1299 Регистрация: 30.1.2007 Где: Киев Репутация: нет Всего: 25 |
она нужна для того, чтобы создать ненаследуемый класс...
ЗЫ. а коли хочешь стандартное применение узнать. рекомендую почитать учебники по C++ |
|||
|
||||
| CLR |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 2 Регистрация: 10.3.2008 Репутация: нет Всего: нет |
||||
|
||||
| SABROG |
|
|||
![]() Hacker ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2481 Регистрация: 18.9.2006 Репутация: 1 Всего: 91 |
Попробую на примере объяснить. Пишем программу типа wikipedia, которая расскажет и покажет нам всю информацию о животных, которые живут в московском зоопарке.
Для начала создадим базовый класс Животное. Определим какие методы могут входить в класс используя знания о животных как таковых. Почти любое животное умеет издавать звуки, мы будем проигрывать этот звук, когда пользователь нажмет на картинку животного в программе. Лев рычит, лошадь ржот, кабан хрюкает. Нам известно, что животное умеет издавать звуки, но звуки должны быть разные для каждого животного, поэтому мы должны переопределить виртуальный метод класса отвечающий за звук животного. Т.е. если базовый класс Животное имеет виртуальный метод Голос(), то мы его переопределяем в каждом новом классе животного, чтобы соотнести нужные звуковые файлы. Можно конечно задать вопрос, нафига оно надо, если можно тупо для каждого нового класса создать метод Голос() не вводя виртуальный метод. А что если существует огромное количество животных без голоса ? Будем прописывать для каждого пустой метод ? Пусть лучше будет один виртуальный, который будет вызываться для каждого из них по-умолчанию и ничего не проигрывать, кроме тишины. |
|||
|
||||
| Sartorius |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1568 Регистрация: 18.7.2006 Где: Ivory tower Репутация: 2 Всего: 37 |
SABROG, думаю речь идет не о виртуальных методах, а о виртуальном базовом классе. Использование виртуального наследования позволяет избежать дублирования в такой иерархии A -- если класс не виртуальный / \ B C \ / D -- получаем две копии здесь как-то так... http://www.citforum.ru/programming/cpp_march/cpp_081.shtml Это сообщение отредактировал(а) Sartorius - 20.3.2008, 13:07 |
|||
|
||||
| SABROG |
|
|||
![]() Hacker ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2481 Регистрация: 18.9.2006 Репутация: 1 Всего: 91 |
Если я не ошибаюсь, то копируются только данные, методы остаются в одном экземпляре. Если в виртуальном классе будут данные, то они в любом случае будут копироваться, или я не прав и надо делать так, чтобы данных там небыло ?
Или если взять любой базовый не виртуальный класс и просто не прописывать данные, то он тоже по сути дублироваться не будет... Это сообщение отредактировал(а) SABROG - 20.3.2008, 13:23 |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
а можно ли ли при использовании виртуального наследования создавать разные базовые классы у потомка ?
class A {}; class A1: public A {}; class A2: public A {}; class B: public virtual A {}; можно ли как то сделать чтоб у класса B в зависимости от условия создавался А, либо А1, либо А2 ? |
|||
|
||||
| Sartorius |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1568 Регистрация: 18.7.2006 Где: Ivory tower Репутация: 2 Всего: 37 |
Класс D при невиртуальном базовом A получает по копии полей класса A от B и С. Конечно памяти жалко, но гораздо хуже то, что если методы класса B работают с полями A и методы класса C работают с полями A - то каждый будет работать со своей копией, чего можно избежать при объявлении A виртуальным в списке наследования.
|
|||
|
||||
| SABROG |
|
|||
![]() Hacker ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2481 Регистрация: 18.9.2006 Репутация: 1 Всего: 91 |
Всё, понял. Забыл, что это НАГ. Это сообщение отредактировал(а) SABROG - 20.3.2008, 13:38 |
|||
|
||||
| Alek86 |
|
||||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1299 Регистрация: 30.1.2007 Где: Киев Репутация: нет Всего: 25 |
только так:
ну, или макросами, возможно... |
||||
|
|||||
| Graf_h |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 482 Регистрация: 18.10.2007 Где: г. Ровно, Украина Репутация: нет Всего: 5 |
Можете поконкретнее обьяснить: для чего вообще нужно это виртуальное наследование, а то в книжках все как то не конкретно!
-------------------- Иногда переменная - это просто переменная |
|||
|
||||
| Alek86 |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1299 Регистрация: 30.1.2007 Где: Киев Репутация: нет Всего: 25 |
1. вопрос скорее в ветку для новичков
2. воспользуйся гуглом, есть куча статей, где на пальцах обьяснено |
|||
|
||||
| Graf_h |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 482 Регистрация: 18.10.2007 Где: г. Ровно, Украина Репутация: нет Всего: 5 |
Спасибо Sartorius! А если A виртуальный, что тогда? Это сообщение отредактировал(а) Graf_h - 20.3.2008, 17:47 -------------------- Иногда переменная - это просто переменная |
|||
|
||||
| bsa |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
если A невиртуальный:
Если А виртуальный:
|
||||
|
|||||
| archimed7592 |
|
|||
![]() Архимед ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2531 Регистрация: 12.6.2004 Где: Moscow Репутация: 6 Всего: 93 |
Ты действительно думаешь, что в язык добавили этот вид наследование только для того, чтобы создавать ненаследуемые классы? -------------------- If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas. © George Bernard Shaw |
|||
|
||||
![]()
|
| Правила форума "C/C++: Для новичков" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |