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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Виртуальное наследование 
V
    Опции темы
Graf_h
Дата 20.3.2008, 12:13 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Росскажите пожалуйста для чего эта штука! кто ее использовал, можно ли обойтись без этого?


--------------------
Иногда переменная - это просто переменная
PM MAIL ICQ   Вверх
Alek86
Дата 20.3.2008, 12:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



она нужна для того, чтобы создать ненаследуемый класс... smile


ЗЫ. а коли хочешь стандартное применение узнать. рекомендую почитать учебники по C++


--------------------
user posted image    user posted image
PM MAIL   Вверх
CLR
Дата 20.3.2008, 12:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(Graf_h @  20.3.2008,  12:13 Найти цитируемый пост)
можно ли обойтись без этого? 

Телепаты пока что ещё в отпуске, так что покажите где и как вы исполизуйте Виртуальное наследование
PM MAIL   Вверх
SABROG
Дата 20.3.2008, 12:41 (ссылка) |   (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


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

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



Попробую на примере объяснить. Пишем программу типа wikipedia, которая расскажет и покажет нам всю информацию о животных, которые живут в московском зоопарке.

Для начала создадим базовый класс Животное. Определим какие методы могут входить в класс используя знания о животных как таковых. Почти любое животное умеет издавать звуки, мы будем проигрывать этот звук, когда пользователь нажмет на картинку животного в программе. Лев рычит, лошадь ржот, кабан хрюкает. Нам известно, что животное умеет издавать звуки, но звуки должны быть разные для каждого животного, поэтому мы должны переопределить виртуальный метод класса отвечающий за звук животного. Т.е. если базовый класс Животное имеет виртуальный метод Голос(), то мы его переопределяем в каждом новом классе животного, чтобы соотнести нужные звуковые файлы.

Можно конечно задать вопрос, нафига оно надо, если можно тупо для каждого нового класса создать метод Голос() не вводя виртуальный метод. А что если существует огромное количество животных без голоса ? Будем прописывать для каждого пустой метод ? Пусть лучше будет один виртуальный, который будет вызываться для каждого из них по-умолчанию и ничего не проигрывать, кроме тишины.


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
Sartorius
Дата 20.3.2008, 13:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 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
PM MAIL ICQ   Вверх
SABROG
Дата 20.3.2008, 13:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


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

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



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

Или если взять любой базовый не виртуальный класс и просто не прописывать данные, то он тоже по сути дублироваться не будет...

Это сообщение отредактировал(а) SABROG - 20.3.2008, 13:23


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
mes
Дата 20.3.2008, 13:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

Репутация: 79
Всего: 250



а можно ли ли при использовании виртуального наследования создавать разные базовые классы у потомка ?

class A {};
class A1: public A {};
class A2: public A {};

class B: public virtual A {};

можно ли как то сделать чтоб у класса B в зависимости от условия создавался А, либо А1, либо А2 ?





--------------------
PM MAIL WWW   Вверх
Sartorius
Дата 20.3.2008, 13:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

Репутация: 2
Всего: 37



 Класс D при невиртуальном базовом A получает по копии полей класса A от B и С. Конечно памяти жалко, но гораздо хуже то, что если методы класса B работают с полями A и методы класса C работают с полями A  - то каждый будет работать со своей копией, чего можно избежать при объявлении A виртуальным в списке наследования.
PM MAIL ICQ   Вверх
SABROG
Дата 20.3.2008, 13:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


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

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



Цитата

Спецификатор virtual в описании базы позволяет минимизировать структуру объекта. Различные варианты обращения к данным-членам базового фрагмента приводят к модификации одних и тех же переменных.


Всё, понял. Забыл, что это НАГ.

Это сообщение отредактировал(а) SABROG - 20.3.2008, 13:38


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
Alek86
Дата 20.3.2008, 14:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(mes @  20.3.2008,  13:23 Найти цитируемый пост)
можно ли как то сделать чтоб у класса B в зависимости от условия создавался А, либо А1, либо А2 ?

только так:

Код

class A {};
class A1 {};
class A2 {};

template<typename TBase, int condition>
class B: public virtual A {};

template<typename TBase>
class B<TBase, 1> : public virtual A1 {};

template<typename TBase>
class B<TBase, 2> : public virtual A2 {};


ну, или макросами, возможно...


--------------------
user posted image    user posted image
PM MAIL   Вверх
Graf_h
Дата 20.3.2008, 15:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Можете поконкретнее обьяснить: для чего вообще нужно это виртуальное наследование, а то в книжках все как то не конкретно!


--------------------
Иногда переменная - это просто переменная
PM MAIL ICQ   Вверх
Alek86
Дата 20.3.2008, 15:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



1. вопрос скорее в ветку для новичков

2. воспользуйся гуглом, есть куча статей, где на пальцах обьяснено


--------------------
user posted image    user posted image
PM MAIL   Вверх
Graf_h
Дата 20.3.2008, 16:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Sartorius @  20.3.2008,  13:02 Найти цитируемый пост)
Использование виртуального наследования позволяет избежать дублирования в такой иерархии      A    -- если класс не виртуальный   /     \  B      C  \        /      D    -- получаем две копии здеськак-то так...http://www.citforum.ru/programming/cpp_march/cpp_081.shtml


Спасибо Sartorius! А если A  виртуальный, что тогда?

Это сообщение отредактировал(а) Graf_h - 20.3.2008, 17:47


--------------------
Иногда переменная - это просто переменная
PM MAIL ICQ   Вверх
bsa
Дата 20.3.2008, 21:12 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

Репутация: 85
Всего: 196



если A невиртуальный:
Код
A     A
\     /
 B   C
  \ /
   D
D содержит две копии A
Если А виртуальный:
Код
   A
  / \
 B   C
  \ /
   D
D содержит только одну копию A
PM   Вверх
archimed7592
Дата 20.3.2008, 23:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


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

Репутация: 6
Всего: 93



Цитата(Alek86 @  20.3.2008,  12:16 Найти цитируемый пост)
она нужна для того, чтобы создать ненаследуемый класс...

Ты действительно думаешь, что в язык добавили этот вид наследование только для того, чтобы создавать ненаследуемые классы? smile



--------------------
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
PM Jabber   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


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

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


 




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


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

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