Объясните пожалуйста что это такое и с чем его едят.
Везде пишут только про простые static или virtual функции.
Можно ли использовать такие конструкции?Пробовал методом проб и ошибок, но ничего не вышло, компилятор посылает меня с моими функциями очень далеко.
И еще вопрос раз уже дорвался до форума.Как можно использовать virtual для множественного наследования?Если это все возможно, то хотелось бы увидеть реальные примеры с объяснением.
Буду очень признателен за просвещение или ссылку где можно это все почерпнуть.
Заранее спасибо.
Здравствуйте, MaximE, Вы писали:
ME>Здравствуйте, MByte, Вы писали:
MB>>Буду очень признателен за просвещение или ссылку где можно это все почерпнуть.
ME>Может стоит купить хорошую книжку по c++, например Страуструпа?
У меня есть Страуструп, но там я нашел только описание virtual и static.Их комбинации нигде не видел, тем более с примерами.Может плохо искал.Искал в интернете.Результат ноль.Все тыкают куда угодно, говорят мол есть такое, а рассказать толком, да еще и примеры привести никто не может.Все только умничать и умеют.Устал искать уже, вот и решил закинуть вопрос на форум.
MB>>> Буду очень признателен за просвещение или ссылку где можно это все MB>>> почерпнуть. ME>> Может стоит купить хорошую книжку по c++, например Страуструпа? M> У меня есть Страуструп, но там я нашел только описание virtual и M> static.Их комбинации нигде не видел, тем более с примерами.Может плохо M> искал.Искал в интернете.Результат ноль.Все тыкают куда угодно, говорят M> мол есть такое, а рассказать толком, да еще и примеры привести никто не M> может.Все только умничать и умеют.Устал искать уже, вот и решил закинуть M> вопрос на форум.
Статические функции (класса) не могут быть виртуальными
Здравствуйте, MByte, Вы писали:
MB>Здравствуйте, MaximE, Вы писали:
ME>>Здравствуйте, MByte, Вы писали:
MB>>>Буду очень признателен за просвещение или ссылку где можно это все почерпнуть.
ME>>Может стоит купить хорошую книжку по c++, например Страуструпа?
MB>У меня есть Страуструп, но там я нашел только описание virtual и static.Их комбинации нигде не видел, тем более с примерами.Может плохо искал.Искал в интернете.Результат ноль.Все тыкают куда угодно, говорят мол есть такое, а рассказать толком, да еще и примеры привести никто не может.Все только умничать и умеют.Устал искать уже, вот и решил закинуть вопрос на форум.
Такая комбинация невозможна. Для работы виртуальной функции необходим доступ к таблице виртуальных функций класса. Этот доступ возможен только через указатель на эту таблицу (по крайней мере во многих реализациях это так), а указатель содержится в каждом объекте. static же функция ни с какими объектами дела не имеет, а посему не имеет возможности добраться до таблицы.
Здравствуйте, MByte, Вы писали:
MB>У меня есть Страуструп, но там я нашел только описание virtual и static.Их комбинации нигде не видел, тем более с примерами.Может плохо искал.Искал в интернете.Результат ноль.Все тыкают куда угодно, говорят мол есть такое, а рассказать толком, да еще и примеры привести никто не может.Все только умничать и умеют.Устал искать уже, вот и решил закинуть вопрос на форум.
Статические функции не могут быть виртуальными, а виртуальные — статическими. Поэтому и нет нигде ничего.
А что вообще за проблема, зачем вдруг понадобилось?
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Здравствуйте, MByte, Вы писали:
MB>У меня есть Страуструп, но там я нашел только описание virtual и static.Их комбинации нигде не видел, тем более с примерами.Может плохо искал.Искал в интернете.Результат ноль.Все тыкают куда угодно, говорят мол есть такое, а рассказать толком, да еще и примеры привести никто не может.Все только умничать и умеют.Устал искать уже, вот и решил закинуть вопрос на форум.
Вот твое исходное высказывание PM>>> Статические функции (класса) не могут быть виртуальными
Из него можно сделать при желании неверный вывод, что статические функции (не класса — т.е. с внутренней компоновкой)могут быть виртуальными
Of course, the code must be complete enough to compile and link.
Здравствуйте, MaximE, Вы писали:
ME>Здравствуйте, MByte, Вы писали:
MB>>У меня есть Страуструп, но там я нашел только описание virtual и static.Их комбинации нигде не видел, тем более с примерами.Может плохо искал.Искал в интернете.Результат ноль.Все тыкают куда угодно, говорят мол есть такое, а рассказать толком, да еще и примеры привести никто не может.Все только умничать и умеют.Устал искать уже, вот и решил закинуть вопрос на форум.
ME>А зачем тебе такое?
Как-то спросили меня, а я не знал что ответить.С тех пор ищу ответ.Просто интересно.Программируя на С++ даже не задумывался про такую конструкцию.Вот здесь http://cprime.hypermart.net/rus/lesson/21.htm нашел пример.Но сделать свой не смог.
Здравствуйте, MByte, Вы писали:
MB>Здравствуйте, MaximE, Вы писали:
ME>>Здравствуйте, MByte, Вы писали:
MB>>>У меня есть Страуструп, но там я нашел только описание virtual и static.Их комбинации нигде не видел, тем более с примерами.Может плохо искал.Искал в интернете.Результат ноль.Все тыкают куда угодно, говорят мол есть такое, а рассказать толком, да еще и примеры привести никто не может.Все только умничать и умеют.Устал искать уже, вот и решил закинуть вопрос на форум.
ME>>А зачем тебе такое?
MB>Как-то спросили меня, а я не знал что ответить.С тех пор ищу ответ.Просто интересно.Программируя на С++ даже не задумывался про такую конструкцию.Вот здесь http://cprime.hypermart.net/rus/lesson/21.htm нашел пример.Но сделать свой не смог.
Здравствуйте, MByte, Вы писали:
ME>>А зачем тебе такое?
MB>Как-то спросили меня, а я не знал что ответить.С тех пор ищу ответ.Просто интересно.Программируя на С++ даже не задумывался про такую конструкцию.Вот здесь http://cprime.hypermart.net/rus/lesson/21.htm нашел пример.Но сделать свой не смог.
А там же написано:
Однако то, что мы сейчас сделали, компилироваться не будет. Дело в том, что статические функции (объявленные как static) не могут быть виртуальными.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
LL> Вот твое исходное высказывание PM>>>> Статические функции (класса) не могут быть виртуальными LL> Из него можно сделать при желании неверный вывод, что статические LL> функции (не класса — т.е. с внутренней компоновкой)могут быть LL> виртуальными
уел
Здравствуйте, LaptevVV, Вы писали:
LVV>Здравствуйте, MByte, Вы писали:
ME>>>А зачем тебе такое?
MB>>Как-то спросили меня, а я не знал что ответить.С тех пор ищу ответ.Просто интересно.Программируя на С++ даже не задумывался про такую конструкцию.Вот здесь http://cprime.hypermart.net/rus/lesson/21.htm нашел пример.Но сделать свой не смог.
LVV>А там же написано: LVV>Однако то, что мы сейчас сделали, компилироваться не будет. Дело в том, что статические функции (объявленные как static) не могут быть виртуальными.
С этим более менее понятно, а что насчет множественного наследования с помощью virtual?
Здравствуйте, MByte, Вы писали:
LVV>>А там же написано: LVV>>Однако то, что мы сейчас сделали, компилироваться не будет. Дело в том, что статические функции (объявленные как static) не могут быть виртуальными.
MB>С этим более менее понятно, а что насчет множественного наследования с помощью virtual?
Тут я пока пас — не приходилось использовать на практике. Но в теории виртуальное множественное наследование применяется, чтобы избежать проблемы ромбика, когда от одного класса сначала наследуют два, а потом от этих двух наследует один.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Здравствуйте, MByte, Вы писали:
MB>Здравствуйте, LaptevVV, Вы писали:
LVV>>Здравствуйте, MByte, Вы писали:
ME>>>>А зачем тебе такое?
MB>>>Как-то спросили меня, а я не знал что ответить.С тех пор ищу ответ.Просто интересно.Программируя на С++ даже не задумывался про такую конструкцию.Вот здесь http://cprime.hypermart.net/rus/lesson/21.htm нашел пример.Но сделать свой не смог.
LVV>>А там же написано: LVV>>Однако то, что мы сейчас сделали, компилироваться не будет. Дело в том, что статические функции (объявленные как static) не могут быть виртуальными.
MB>С этим более менее понятно, а что насчет множественного наследования с помощью virtual?
Прикинь, разрабатываешь оконное GUI типа Виндов. И вот у тебя есть три типа окон: просто окно(прямоугольник, текст заголовка,...) (class Window), и два его потомка — окно с меню (Window_with_menu) и окно с полосой прокрутки ( Window_with_scroll). И пришла тебе идея создать окно с меню и с прокруткой. Самый простой путь —
class Window_with_menu_and_scroll : public Window_with_menu, public Window_with_scroll
{
...
}
Но если так, то в каждом экземпляре Window_with_menu_and_scroll будет ДВА экземпляра Window: из Window_with_menu
и из Window_with_scroll. И как тогда его рисовать (Window_with_menu_and_scroll ) ?
А если
class Window_with_menu_and_scroll : public virtual Window_with_menu, public virtual Window_with_scroll
{
...
}
то в Window_with_menu_and_scroll будет только одна копия Window, что и требовалось.
В Страуструпе (гл. 15, по-моему,"Иерархия классов") есть еще пара примеров, довольно небесполезных.
Здравствуйте, Lorenzo_LAMAS, Вы писали:
L_L>Их комбинация невозможна (и не нужна)
А по-моему пригодилась бы.
Пусть внутри функции this не нужен, но вызов конкретной переопределенной реализации должен осуществляться на основе динамического типа экземпляра (если экземпляра нет, то явной квалификацией класса).
Не слишком сумбурно изложил?