Рассмотрим У меня есть ряд производных классов, например, как указано ниже:Наследование и члены функции
class A
{
...
}
class B1 : public A //there may be many B's here say, B2, B3 etc
{
...
}
class C1 : public B1 //may be more C's as well
{
...
}
Я хотел бы поставить все объекты в одном контейнере, таким образом, все было бы типа класса A
.
Предположим, я хотел бы добавить функцию в класс C1
, что было бы лучшим способом достичь этого? Мои параметры представляли бы его в базовом классе A
и записывали необходимую реализацию в C1
, или я мог бы ввести его в C1
и сделать динамическое кастинг для его доступа. Какой из них предпочтительнее? Неужели динамическое литье слишком дорого? (Моим основным ограничением является время выполнения. У меня есть флаг в базовом классе, чтобы указать, какой тип производного объекта он есть, поэтому мне не нужно динамически бросать каждый объект в контейнер. Может ли добавление ненужных функций базовому классу ? в плохом использовании кэша команд)
Никто не может сказать, является ли динамическое кастинг «слишком дорогим», потому что то, что вы можете себе позволить, субъективно. Поскольку это похоже на то, что вам нужно («Мое основное ограничение - время выполнения»), я бы рекомендовал сделать это в обоих направлениях и сравнить результаты, чтобы увидеть, слишком ли дорого для вашего конкретного оборудования и оптимизаций компилятора, а также для использования случаев и внешние ограничения и ... – Altainia
Слишком широкий интерфейс - это плохой дизайн и, как следствие, сокращение времени, вы можете сохранить дополнительную коллекцию с указателями на более конкретные интерфейсы. – imreal
Вы можете использовать «вариант» с шаблоном посетителя. – AndyG