| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Общие вопросы > Конструктор в наследуемом классе. |
| Автор: Felixx 12.10.2011, 20:03 | ||||||
| Доброго время суток. У меня имеется проблемка небольшая, подскажите пожалуйста что не так сделано?.. Суть проблемы такова: Имеем абстрактный класс:
1й наследник:
2й Наследник:
В консоль выводитса: test2 test1 тоесть сначало из метода WriteImpl и только потом из конструктора.. С чем это может быть связано? Может что то не так написано? |
| Автор: boostcoder 12.10.2011, 20:22 |
| ты разделом ошибся. |
| Автор: Felixx 12.10.2011, 20:37 |
| А куда нужно? |
| Автор: borisbn 12.10.2011, 21:15 |
http://forum.vingrad.ru/forum/dotnet-general-net-questions-csharp.html а до диез так ничего... в описании класса... e.StackTrace - так вообще замечательно... /me goes to take a look at dotNet |
| Автор: Felixx 12.10.2011, 21:36 | ||
Да делал я конструктор, и в конструкторе инициализировал массив. Ничего не менялос Добавлено через 2 минуты и 56 секунд Тема переехала в свой раздел: http://forum.vingrad.ru/forum/act-ST/f-199/t-339723/unread-1.html |
| Автор: math64 12.10.2011, 21:52 |
| Перед выполнением конструктора класса (PROTOCOL_LOBBY_CREATE_ROOM_ACK) выполняется конструктор базового класса (PBLoginPacket) В этом конструкторе вызывается абстрактный метод WriteImpl. Если бы ты писал на C++ - программа бы у тебя на этом вылетела бы. В C# вызывается переопределённый метод WriteImpl класса PROTOCOL_LOBBY_CREATE_ROOM_ACK, который печатает test2. После этого выполняется конструктор PROTOCOL_LOBBY_CREATE_ROOM_ACK, который печатает test1. Так что из коструктора виртуальные функции лучше не вызывать - в C# она может обратиться к ещё не иницализированным полям, в C++ можешь напоротся на вызов абстрактной функции, для которой определения нет - программа печатает pure virtual function called или что-то подобное и завершает работу. А так тебе надо в раздел C# |