Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Конструктор в наследуемом классе.


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

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

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 и только потом из конструктора.. С чем это может быть связано? Может что то не так написано?

Автор: boostcoder 12.10.2011, 20:22
ты разделом ошибся.

Автор: Felixx 12.10.2011, 20:37
А куда нужно?

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

http://forum.vingrad.ru/forum/dotnet-general-net-questions-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

Автор: Felixx 12.10.2011, 21:36
Цитата(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/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#

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

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

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

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

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)