Модераторы: Daevaorn
  

Поиск:

Закрытая темаСоздание новой темы Создание опроса
> Конструктор в наследуемом классе. 
:(
    Опции темы
Felixx
Дата 12.10.2011, 20:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 113
Регистрация: 4.12.2008

Репутация: нет
Всего: нет



Доброго время суток. У меня имеется проблемка небольшая, подскажите пожалуйста что не так сделано?..
Суть проблемы такова:

Имеем абстрактный класс:
Код

public class PackageBuilder
{
    private byte[] buffer = new byte[] { };

     ..... куча методов.
}


1й наследник:
Код

public abstract class PBLoginPacket : PackageBuilder
{
        public PBLoginPacket()
        {
            try
            {
                this.WriteImpl();
            }
            catch (Exception e)
            {
                Console.Write(e.StackTrace);
            }
            ..... куча методов.
            
            protected abstract void WriteImpl();
        }
}


2й Наследник:

Код

class PROTOCOL_LOBBY_CREATE_ROOM_ACK : PBLoginPacket
{
        public PROTOCOL_LOBBY_CREATE_ROOM_ACK()
        {
            System.Console.WriteLine("test1");
        }

        protected override void WriteImpl()
        {
            System.Console.WriteLine("test2");
        }
}



В консоль выводитса:
test2
test1

тоесть сначало из метода WriteImpl и только потом из конструктора.. С чем это может быть связано? Может что то не так написано?
PM MAIL   Вверх
boostcoder
Дата 12.10.2011, 20:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



ты разделом ошибся.
PM WWW   Вверх
Felixx
Дата 12.10.2011, 20:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 113
Регистрация: 4.12.2008

Репутация: нет
Всего: нет



А куда нужно?
PM MAIL   Вверх
borisbn
Дата 12.10.2011, 21:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 22
Всего: 135



Цитата(Felixx @  12.10.2011,  20:37 Найти цитируемый пост)
А куда нужно?

http://forum.vingrad.ru/forum/dotnet-gener...ons-csharp.html

а до диез так ничего...

Цитата(Felixx @  12.10.2011,  20:03 Найти цитируемый пост)
private byte[] buffer = new byte[] { };

в описании класса...

Цитата(Felixx @  12.10.2011,  20:03 Найти цитируемый пост)
Console.Write(e.StackTrace);

e.StackTrace - так вообще замечательно...

/me goes to take a look at dotNet


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
Felixx
Дата 12.10.2011, 21:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 113
Регистрация: 4.12.2008

Репутация: нет
Всего: нет



Цитата(borisbn @ 12.10.2011,  21:15)
Цитата(Felixx @  12.10.2011,  20:03 Найти цитируемый пост)
private byte[] buffer = new byte[] { };

в описании класса...

Да делал я конструктор, и в конструкторе инициализировал массив. Ничего не менялос

Добавлено через 2 минуты и 56 секунд
Тема переехала в свой раздел: http://forum.vingrad.ru/forum/act-ST/f-199...3/unread-1.html
PM MAIL   Вверх
math64
Дата 12.10.2011, 21:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 8
Всего: 72



Перед выполнением конструктора класса (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#
PM   Вверх
borisbn
Дата 12.10.2011, 23:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 22
Всего: 135



Цитата(Felixx @  12.10.2011,  21:36 Найти цитируемый пост)
Да делал я конструктор, и в конструкторе инициализировал массив. Ничего не менялос

та не, я просто умилялся синтаксисом  smile 

Цитата(Felixx @  12.10.2011,  21:36 Найти цитируемый пост)
Тема переехала в свой раздел:

не std::move, а std::copy smile


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
  
Закрытая темаСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0469 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.