Короткий ответ - да, используйте оператор dynamic_cast
(но см. Ниже).Волшебная функция будет выглядеть примерно так:
void function(A& a)
{
B* b = dynamic_cast<B*>(&a);
if (b)
{
// Object is a B...
b->bar();
}
else
{
// fallback logic using only methods on A
}
}
Но учтите, что многие программисты считают это запахом кода.В частности, если нет способа реализовать «запасную» ветвь, то она предлагает, чтобы функция действительно принимала B
, и что-то в дизайне может быть ошибочным.(Трудно сказать, когда говорите в таких общих чертах, однако.) Также имейте в виду, что dynamic_cast
может быть дорогим, особенно со сложной иерархией классов.
Если это вообще разумно, предпочтительнее переместить B
-специфическая логика в класс B
как-то.Вы можете также рассмотреть вопрос о том, чтобы сделать метод bar
членом класса A
(A
обеспечит некоторую разумную реализацию по умолчанию).Другой подход может состоять в том, чтобы создать новый интерфейс для хранения метода bar
и заставить вашу функцию принимать объект этого типа.(Класс B
будет реализовывать как A
, так и новый интерфейс.)