Цель полиморфизма на любом языке - не заботиться о том, что это за тип. Если вы даете кому-либо, будь то Lua или C ++, объект Bar
, тогда Bar
должен иметь интерфейсы, необходимые людям для выполнения всего, что им нужно.
Это цель виртуальных функций. Виртуальная функция, определенная в Bar
, может быть переопределена другим поведением в BarDerived1
. Другой код не должен знать, что им передается производный класс; они могут просто взять Bar
, как всегда.
Как правило, существует только две причины сделать класс производным от другого. Первый - полиморфизм: вы хотите специализировать класс, изменяя поведение определенных функций.
Другая причина - получить доступ к его реализации. Например, если вы создаете строку Unicode, вы можете использовать std :: basic_string для хранения закодированных данных. Затем вы можете в частном порядке получить из std :: basic_string, что позволит вам получить оптимизацию хранилища, которую имеет std :: basic_string, но вы предоставите другой интерфейс (поскольку частное наследование не позволяет внешнему миру знаю, что вы получили от него).
Если вы хотите, чтобы все использовали Bar
объекты, которые могут иметь различное поведение в зависимости от производных классов, то вам следует использовать виртуальные функции и полиморфизм. Однако, если вы меняете интерфейс в производных классах, то это, вероятно, признак проблемы проектирования. Возможно, эти производные классы вообще не должны быть производными. Возможно, они должны быть полностью отдельными классами, которые может иметь или не иметь экземпляр Bar
, основываясь на некоторых параметрах инициализации.
Трудно сказать больше без подробностей о том, что вы на самом деле делаете. Но в целом, если вы правильно используете полиморфизм на основе наследования, вам не нужно приводить от Bar
к более производным версиям. Просто используйте интерфейс Bar
.