Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
TheChosenOne
13 / 13 / 1
Регистрация: 13.09.2013
Сообщений: 113
#1

Почему при виртуальном наследовании компилятор не знает о иерархии? - C++

05.07.2014, 18:26. Просмотров 239. Ответов 1
Метки нет (Все метки)

Рассмотрим пример:

C++
1
2
3
4
5
6
7
8
9
10
11
12
class Base
{ 
   virtual void foo()=0;
};
 
class Derv :public Base
{
   foo(){}
};
 //Тут компилятор знает о всей иерархии можно осуществлять преобразования:
Base* bp = new Derv;
Derv* dp = static_cast<Derv*>(bp); //Все ок
Но как только режим наследования становится public virtual, компилятор уже "не знает" ничего о том что Base явл. базовым классом для Derv, и необходим dynamic_cast (RTTI mechanism) . Сообсно вопрос: Почему компилятор вдруг "перестает знать" о иерархии? (Раньше ведь знал -> информация где-то хранилась и не было необходимости лезть в vtable за информацией о типе)
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.07.2014, 18:26
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Почему при виртуальном наследовании компилятор не знает о иерархии? (C++):

О виртуальном наследовании - C++
Хотелось бы с Вашей помощью разобраться в деталях виртуального наследования. Вопрос такой: что на физическом уровне означает выражение ...

Почему при создании класса у абстракных классов по иерархии пусто в _vptr ? - C++
Вот что я имею ввиду:

Компилятор не знает dirent.h - C++
Как это исправить?

При компилировании компилятор вылетает,нет ли ошибок, или почему он так? - C++
#include &lt;iostream&gt; #include &lt;fstream&gt; #include &lt;iomanip&gt; using namespace std; int main; void init (int matrix, int size); ...

Компилятор не знает тип ushort - C++
Здравствуйте. Увидел тип ushort в учебнике,сперва не понял,что за тип такой,но потом узнал,что это просто сокращённый вариант unsigned...

Почему, при попытке "взять" адрес переменной,компилятор ее не положит на регистр? - C++
почему, при попытке &quot;взять&quot; адрес переменной,компилятор ее не положит на регистр

1
0x10
2548 / 1728 / 264
Регистрация: 24.11.2012
Сообщений: 4,349
05.07.2014, 19:24 #2
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
На этапе компиляции неизвестно смещение между виртуальным базовым классом и наследниками. При такой простой иерархии это неочевидно - но становится вполне понятно если рассмотреть ромбовидную.
Ссылка по теме: http://habrahabr.ru/company/pvs-studio/blog/186682/
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.07.2014, 19:24
Привет! Вот еще темы с ответами:

Использование шаблонов при наследовании, ошибка при компиляции - C++
При изучении списков написал шаблон протестировал, все работает. После написал класс наследник от шаблона List.h, компилятор выдает...

Сравнение при наследовании - C++
Есть базовый класс, пусть его зовут А, а у него есть 4 потомка. Пусть их зовут: B, C, D и E. Базовый класса абстрактный,в нём есть...

Ошибка при наследовании? - C++
Программа компилируется, но консоль не выдает информацию. Связано ли это как то с переполнением буфера? Программа небольшая укажите...

Ошибка при наследовании - C++
Имеется архитектура вида: класс &quot;человек&quot;, от него производные &quot;препод&quot; и &quot;член приемной комиссии&quot;. От их двоих производный класс &quot;Препод и...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru