Недавно я работал над фрагментом кода C++ для стороннего проекта (библиотека cpp-markdown
для любопытный) и столкнулся с вопросом кодирования, по которому я хотел бы услышать некоторые мнения.
cpp-markdown
имеет базовый класс Token
, у которого есть несколько подклассов. Два основных подкласса — это Container
(который содержит наборы других Token
) и TextHolder
(используется в качестве базового класса для Token
, которые, конечно же, содержат текст).
Большая часть обработки выполняется с помощью виртуальных функций, но некоторые из них лучше обрабатывать в одной функции. Для этого я использовал dynamic_cast
для понижения указателя Token*
на один из его подклассов, чтобы я мог вызывать функции, специфичные для подкласса и его дочерних классов. Нет никаких шансов, что приведение будет неудачным, потому что код может сказать, когда это необходимо, с помощью виртуальных функций (таких как isUnmatchedOpenMarker
).
Есть два других способа справиться с этим:
Создайте все функции, которые я хочу вызвать, как виртуальные функции
Token
, и просто оставьте их с пустым телом для каждого подкласса, кроме тех, которые должны их обрабатывать, или...Создайте виртуальную функцию в
Token
, которая будет возвращать правильно типизированный указатель наthis
, когда он вызывается для определенных подтипов, и нулевой указатель, если вызывается что-то еще. По сути, это расширение системы виртуальных функций, которую я там уже использую.
Второй способ мне кажется лучше как существующего, так и первого. Но я хотел бы узнать мнение других опытных разработчиков C++ по этому поводу. Или я слишком много беспокоюсь о пустяках. :-)