Можно ли через указатель на базовый класс обратиться к полю его дочернего класса?

  • 28 августа 2023 г. 19:26
Ответы на вопрос 2
Да, через указатель на базовый класс можно обратиться к полю его дочернего класса, если поле является членом именно этого класса и не перекрыто виртуальными функциями или статическими полями.

Относительно второго вопроса - чтобы обратиться к полю реализации второго интерфейса без использования dynamic_cast или упоминания о реализации, можно воспользоваться приведением типа через static_pointer_cast. Однако, это работает только если объект, на который указывает shared_ptr, действительно является экземпляром класса с реализацией второго интерфейса. Если это не так, использование метода интерфейса, принимающего shared_ptr на этот интерфейс, может привести к непредсказуемому поведению или ошибке времени выполнения.
Если вы уверены, что это экземпляр класса-наследника, вы можете использовать dynamic_cast для приведения его к типу наследника либо вернуть указатель на наследника через виртуальный метод GetDerived(). В противном случае, без преобразования к типу наследника это невозможно. Также, чтобы избежать указания на конкретный класс-наследник, можно вынести данное поле/метод в виртуальный метод базового класса.
Похожие вопросы