2016-08-29 4 views
1

Рассмотрим У меня есть ряд производных классов, например, как указано ниже:Наследование и члены функции

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 и сделать динамическое кастинг для его доступа. Какой из них предпочтительнее? Неужели динамическое литье слишком дорого? (Моим основным ограничением является время выполнения. У меня есть флаг в базовом классе, чтобы указать, какой тип производного объекта он есть, поэтому мне не нужно динамически бросать каждый объект в контейнер. Может ли добавление ненужных функций базовому классу ? в плохом использовании кэша команд)

+4

Никто не может сказать, является ли динамическое кастинг «слишком дорогим», потому что то, что вы можете себе позволить, субъективно. Поскольку это похоже на то, что вам нужно («Мое основное ограничение - время выполнения»), я бы рекомендовал сделать это в обоих направлениях и сравнить результаты, чтобы увидеть, слишком ли дорого для вашего конкретного оборудования и оптимизаций компилятора, а также для использования случаев и внешние ограничения и ... – Altainia

+2

Слишком широкий интерфейс - это плохой дизайн и, как следствие, сокращение времени, вы можете сохранить дополнительную коллекцию с указателями на более конкретные интерфейсы. – imreal

+0

Вы можете использовать «вариант» с шаблоном посетителя. – AndyG

ответ

2

Вы не говорите нам о цели новой функции в C1, и это делает влияет на ответ, но грубые рекомендации:

  • Если новая функция это общее поведение, которое вам может понадобиться на любом объекте, и C1, оказывается, является первым пользователем, определенно просто добавьте интерфейс в A.
  • Если новая функция относится к серии классов но он может следовать какой-то общий шаблон (например пост-обработки) C, добавить метод post_process к A, переопределить его в C1, и имеют , что метод вызовите методы частной реализации C1, чтобы выполнить конкретную задачу пост-обработки.
  • Если ни один из этих случаев не может быть рассмотрен, вы можете пересмотреть свое использование наследования, как это возможно, вы используете его для представления отношений, отличных от подстановки.
+0

. Новая функция может быть выполнена только в 'C1' из-за типа личных данных у него есть доступ, и он называется не так часто. – user6386155

0

добавить виртуальную функцию к вашему базовому классу А лучше, потому что:

  • следует избегать динамическое приведение, особенно в исполнении чувствительного кода. Пожалуйста, см. Performance of dynamic_cast?

  • перед тем, как выполнить операцию типа, вам следует избегать условий для изучения типа объекта (например, это A, B1 или C1?). Не только потому, что он медленный, но и потому, что если вы это сделаете, каждый раз, когда вы добавляете новый тип объекта (например, C2), вам нужно будет проверить все эти условия, чтобы узнать, нужно ли их обновлять.

Смежные вопросы