Я отвечал на вопрос несколько минут назад, и он поднял мне еще один:
В одном из моих проектов я выполняю разбор сетевых сообщений. Сообщения имеют вид:
[1 byte message type][2 bytes payload length][x bytes payload]
Формат и содержание полезных данных определяются типом сообщения. У меня есть иерархия классов, основанная на общем классе Message
.
Для создания экземпляров моих сообщений у меня есть метод статического анализа, который возвращает Message*
в зависимости от байта типа сообщения . Что-то вроде:
Message* parse(const char* frame)
{
// This is sample code, in real life I obviously check that the buffer
// is not NULL, and the size, and so on.
switch(frame[0])
{
case 0x01:
return new FooMessage();
case 0x02:
return new BarMessage();
}
// Throw an exception here because the mesage type is unknown.
}
Мне иногда нужно получить доступ к методам подклассов. Поскольку моя сетевая обработка сообщений должна быть быстрой, я решил избежать dynamic_cast<>
и добавил в базовый класс Message
метод, который возвращает тип сообщения. В зависимости от этого возвращаемого значения, вместо этого я использую static_cast<>
для правого дочернего типа.
Я сделал это главным образом потому, что однажды мне сказали, что dynamic_cast<>
медленно. Однако я не знаю точно, , что он действительно делает и насколько он медленный, поэтому мой метод может быть таким же медленным (или медленным), но гораздо более сложным.
Что вы, ребята, думаете об этом дизайне? Это распространено? Это действительно быстрее, чем использовать dynamic_cast<>
? Любое подробное объяснение того, что происходит под капотом, когда одно использование dynamic_cast<>
приветствуется!
--- РЕДАКТИРОВАТЬ ---
Поскольку некоторые люди спрашивают, почему:
Обычно, когда я получаю кадр, я делаю две вещи:
- Я анализирую сообщение и создаю соответствующий экземпляр подкласса
Message
, если содержимое кадра допустимо. Существует логика no , за исключением части синтаксического анализа.
- Я получаю
Message
и в зависимости от switch(message->getType())
, я static_cast<>
для правильного типа и делаю все, что должно быть сделано с сообщением.