![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| Pilligrim |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 65 Регистрация: 9.6.2006 Репутация: 1 Всего: 1 |
VC++ у меня довольно давно(пишу на нем уже где-то 1,5 года), читал много книг по С++, в частности великого Бьярна Страустрапа(кстати всем советую), давно знаю и успешно применяю(даже слишком везде) классы, соответственно знаю ключевые слова public и private, но вот как-то раз натолкнулся на такие ключевые слова как virtual и protected и словил себя на мысли что я даже не знаю что это такое. Объясните кто-нить плиз что это такое?! |
|||
|
||||
| MaxWave |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 158 Регистрация: 8.3.2006 Репутация: нет Всего: нет |
Не знаешь виртуал??? Разве Страус об этом не рассказывает??? Странно, значит плохо читал.
virtual - ключ. слово перед определением функции в классе. Оно означает, что данная функция является виртуальной и должна унаследоваться производными классами. Они определяют как бы общий интерфейс производных классов,т.е. в производных классах эта ф-я переопределяется. Очень удобно использовать при созднании иерархии классов. А вообще почитай г. Шилдта - там все понятно описано. Использование широко - ищи в нете, сразу найдешь. |
|||
|
||||
| vinter |
|
|||
![]() Explorer ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2735 Регистрация: 1.4.2006 Где: Н.Новгород Репутация: 13 Всего: 56 |
Данные обьявленные как protected можно юзать в производных классах
Полностью согласен |
|||
|
||||
| Pilligrim |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 65 Регистрация: 9.6.2006 Репутация: 1 Всего: 1 |
Спасибо Вам. Я всё понял.
|
|||
|
||||
| Rockie |
|
||||||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1143 Регистрация: 23.4.2006 Репутация: 8 Всего: 31 |
Pilligrim, ты имеешь ввиду virtual и protected внутри класса, или при наследовании от виртуального класса?
если у нас иерархия A / \ B C \ / D и в классе A у нас, например
то при обращении объекта класса D к этому a будет ошибка, так как объект d как бы содержит 2 копии a: от класса B, и от C:
чтобы этого не происходило, используется наследование от виртуального базового класса, с использованием virtual:
модификатор protected в наследовании означает, что данные, определенные в родительском классе, как public, в классе-потомке станут protected -------------------- Чтобы иметь большой гардероб - надо иметь большой гардероб. |
||||||
|
|||||||
| Exception |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 4525 Регистрация: 26.12.2004 Репутация: нет Всего: 186 |
Главное применение ключевого слова virtual - обозначить, что метод может быть переопределён:
Это сообщение отредактировал(а) Exception - 31.7.2006, 21:55 |
|||
|
||||
| sergejzr |
|
|||
![]() Un salsero Профиль Группа: Админ Сообщений: 13285 Регистрация: 10.2.2004 Где: Германия г .Ганновер Репутация: 19 Всего: 360 |
Exception, всё верно, только мы не в С#
|
|||
|
||||
| Exception |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 4525 Регистрация: 26.12.2004 Репутация: нет Всего: 186 |
Воистину. У вас, похоже, override нету
|
|||
|
||||
| sergejzr |
|
||||
![]() Un salsero Профиль Группа: Админ Сообщений: 13285 Регистрация: 10.2.2004 Где: Германия г .Ганновер Репутация: 19 Всего: 360 |
Улавливаете разницу между virtual и "простым" определением?
(особенно смотри p2)
Добавлено @ 22:04 Вот вывод проги:
|
||||
|
|||||
| Exception |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 4525 Регистрация: 26.12.2004 Репутация: нет Всего: 186 |
Вот как у вас хитро
|
|||
|
||||
| Fighter |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 810 Регистрация: 5.1.2005 Репутация: нет Всего: 2 |
||||
|
||||
| sergejzr |
|
|||
![]() Un salsero Профиль Группа: Админ Сообщений: 13285 Регистрация: 10.2.2004 Где: Германия г .Ганновер Репутация: 19 Всего: 360 |
А это ещё одна особенность. если хотя бы одна функция в класса определена как =0, класс будет считаться полностью абстрактным и обьект такого класса создать нельзя. Для того чтобы получить обьект, ребёнку необходимо определить все такие фукции. например:
|
|||
|
||||
| ILAgent |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 51 Регистрация: 1.3.2006 Репутация: нет Всего: нет |
Удивительно ! Что ж ты полтора года писал тогда ? Вобщем, тут надо читать литературу, так просто про сложный полиморфизм не расскажешь. Да и на форуме про это много писалось уже. Это сообщение отредактировал(а) ILAgent - 1.8.2006, 00:59 |
|||
|
||||
| Rockie |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1143 Регистрация: 23.4.2006 Репутация: 8 Всего: 31 |
по этой же причине виртуальный деструктор будет знать, какой объект убить
-------------------- Чтобы иметь большой гардероб - надо иметь большой гардероб. |
|||
|
||||
| Pilligrim |
|
||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 65 Регистрация: 9.6.2006 Репутация: 1 Всего: 1 |
ILAgent, писал проги в которых не использовал возможность наследования классов.
Я уже всё понял. Мне долго объяснять не надо! Всем плиз |
||||
|
|||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |