![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| Hroft |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 310 Регистрация: 20.10.2003 Где: Москва Репутация: нет Всего: 3 |
Я столкнулся с одной проблемой, которая меня заинтересовала, и хочу услышать мнение других людей.
Суть такова: из конструктора абстрактного класса (содержащего чисто виртуальныу функцию) нельзя вызывать чисто виртуальные методы этого класса, которые не переопределены в нем самом, пусть даже этот конструктор будет вызываться только из конструкторов потомков. Причем эту ошибку билдер 6 выявляет только в рантайме, vcpp60 на стадии линковки (объясните плиз, как это возможно при линковке!?!?!?!?), а gcc 3.какой-то при компиляции. Обойти проблему можно, немного изменив логику взаимодействия классов, так что я сам разобрался. Но, если честно, не мог разобраться целых 3 дня. Чтобы не быть голословным, вот пример:
Если кто знает, где можно про это почитать (а также про то, как реализованы v-таблицы), напишите плиз. PS: просто виртуальные (без =0) методы вызывать можно (это вполне логично, они уже имеют тело). |
|||
|
||||
| srd |
|
|||
![]() Нереварин ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 951 Регистрация: 30.8.2003 Где: Владивосток Репутация: 27 Всего: 49 |
Просто виртуальные функции-члены в конструкторах тоже не работают
-------------------- Не смей читать мою подпись!!! |
|||
|
||||
| mr.DUDA |
|
|||
|
3D-маньяк ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8244 Регистрация: 27.7.2003 Где: город-герой Минск Репутация: 25 Всего: 232 |
Это имхо вытекает из смысла чисто виртуальных методов - если в теле конструктора абстрактного класса вызывать чисто виртуальный метод, то компилятор будет вынужден сгенерить вызов функции по указателю на NULL, т.к. не факт что дальше в коде встретится класс с реализацией конструктора и абстрактной функции сразу, а ведь вызов конструктора базового класса по-любому сделать придётся - вот он (компилятор) и генерит в ответ на "B() : A() {}" вызов NULL-функции. -------------------- ![]() |
|||
|
||||
| OlegsDP |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 37 Регистрация: 25.2.2004 Репутация: нет Всего: 1 |
Если класс В наследует класс А, то при создании объекта класса В сначала конструируется класс А, и лишь затем - В. Естественно, при выполнении конструктора А виртуальные функции не будут переопределены, а чисто виртуальные - вообще не будут определены. А уж где вылезет ошибка - в компиляторе, в линкере или при выполнении - зависит от компилятора и линкера.
|
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |