| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Общие вопросы > Виртуальная таблица |
| Автор: cppGhost 24.2.2016, 15:25 | ||
День добрый
Так вот, когда мы приводим "b" к "а". Ведь в "а" , грубо говоря, находится указатель на виртуальную таблицу от класса "В". Иначе как бы мы вызывали виртуальные методы. Но при вызове " a->funcB();" мы получаем ошибку, хотя он в этой таблице ведь тоже есть. Так в чём причина? |
| Автор: xvr 24.2.2016, 16:02 |
Причина в том, что в классе A нет виртуальной функции funcB. И то, что класс B положил ее адрес в таблицу виртуальных методов, никак не повлияет на класс A - он не знает, что лежит в таблице методов дальше func. Для него это все мусор. |
| Автор: vvm 25.2.2016, 10:34 | ||
Добавляем funcB() в struct A
Этот ответ добавлен с нового Винграда - http://ru.vingrad.com/Virtualnaya-tablitsa-id56cda195ae20154b768b4567#findElement_E7045_56ceae7eae20151a51b26235_0 |
| Автор: volatile 25.2.2016, 12:15 |
ну и зачем здесь dynamic_cast ? dynamic_cast вообще редко когда реально нужен, и каждое его появление должно говорить о том, что здесь вероятно что-то не так... Приведение же к базовуму типу - это самое заурядное явление, и dynamic_cast здесь не нужен |
| Автор: cppGhost 25.2.2016, 13:47 |
| xvr, то есть получается, что я просто в кучу смешал два разных правила, так? одно дело знает ли класс A обо всех членах класс В. А другое дело реализация полиморфизма через виртуальную таблицу. xvm, спасибо. про это я в курсе, пример был для наглядности)) volatile, в целом я понимаю, что когда мы так приводим, то хотим сгладить некоторые шереховатости проектирования. Но с другой стороны, а если вот надо привести от В к А, то неужели нужно писать в стиле обычного С ? |
| Автор: volatile 25.2.2016, 15:59 | ||
я нигде не говорил что нужно приводить в стиле С просто в конкретно этом примере приведение вообще не нужно Добавлено через 3 минуты и 34 секунды а вот если нужно обратное приведение - это сигнал того, что вероятно что-то не так в программе. (в прочем исключения конечно есть) |