![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
cppGhost |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 101 Регистрация: 24.4.2013 Репутация: нет Всего: нет |
День добрый
Так вот, когда мы приводим "b" к "а". Ведь в "а" , грубо говоря, находится указатель на виртуальную таблицу от класса "В". Иначе как бы мы вызывали виртуальные методы. Но при вызове " a->funcB();" мы получаем ошибку, хотя он в этой таблице ведь тоже есть. Так в чём причина? |
|||
|
||||
xvr |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 60 Всего: 223 |
||||
|
||||
vvm |
|
|||
Unregistered |
Добавляем funcB() в struct A
Этот ответ добавлен с нового Винграда - http://vingrad.com |
|||
|
||||
volatile |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 37 Всего: 85 |
ну и зачем здесь dynamic_cast ? dynamic_cast вообще редко когда реально нужен, и каждое его появление должно говорить о том, что здесь вероятно что-то не так... Приведение же к базовуму типу - это самое заурядное явление, и dynamic_cast здесь не нужен |
|||
|
||||
cppGhost |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 101 Регистрация: 24.4.2013 Репутация: нет Всего: нет |
xvr, то есть получается, что я просто в кучу смешал два разных правила, так? одно дело знает ли класс A обо всех членах класс В. А другое дело реализация полиморфизма через виртуальную таблицу.
xvm, спасибо. про это я в курсе, пример был для наглядности)) volatile, в целом я понимаю, что когда мы так приводим, то хотим сгладить некоторые шереховатости проектирования. Но с другой стороны, а если вот надо привести от В к А, то неужели нужно писать в стиле обычного С ? |
|||
|
||||
xvr |
|
||||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 60 Всего: 223 |
Да. С++ язык со статической (compile time) типизацией - все, что известно о классе, должно быть известно на момент компиляции его описания. Никакой информации о наследниках базовый класс не имеет. Если нужна динамическая типизация - переходите на языки типа JavaScript (и прочие интерпретируемые). В нем объект не ограничен методами, которые были на момент описания (описания вообще может и не быть ![]() ![]() Добавлено через 2 минуты и 3 секунды
Тут вообще ничего приводить не надо. Надо будет если попробовать привести от A* к B*, и скорее всего достаточно будет static_cast<B*> |
||||
|
|||||
volatile |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 37 Всего: 85 |
я нигде не говорил что нужно приводить в стиле С просто в конкретно этом примере приведение вообще не нужно Добавлено через 3 минуты и 34 секунды а вот если нужно обратное приведение - это сигнал того, что вероятно что-то не так в программе. (в прочем исключения конечно есть) |
|||
|
||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |