Kalombyr
@Kalombyr

Приведение типов указателей, как перегрузить?

Добрый день!
Например, есть класс MyClass и его интерфейс IInterface
если сделать:
MyClass * myClass = new MyClass();
IInterface * interface;

То что бы привести к типу IInterface достаточно просто:
interface = myClass;
А вот наоборот, уже придётся явно прописывать:
myClass = static_cast<MyClass*>(interface);
Что можно сделать, что бы не приходилось это прописывать?
То есть нужно просто
myClass = interface;
static_cast и остальные касты переопределить нельзя ведь...
начал думать над перегрузкой оператора
explicit operator IInterface*()
Но в случае указателей это разумеется не срабатывает. Как можно сделать?
  • Вопрос задан
  • 559 просмотров
Пригласить эксперта
Ответы на вопрос 2
@Mercury13
Программист на «си с крестами» и не только
Для этого есть специальная операция, dynamic_cast.
myClass = dynamic_cast<MyClass*>(interface);
Если interface не MyClass, то вернёт NULL.

В случае, если через dynamic_cast присваиваем не указатели, а ссылки, выбросит аварию std::bad_cast.

UPD. Такие преобразования «вниз» — это компромисс между ООП и реальностью, которая вынуждает упрощать интерфейсы. Например, в C++ Builder
int __fastcall SomeObject::ButtonClick(TObject* Sender)
{
  TButton* button = dynamic_cast<TButton*>(Sender);
  ...
}
Ответ написан
vt4a2h
@vt4a2h Куратор тега C++
Senior software engineer (C++/Qt/boost)
Вообще, если вам по какой-то причине необходимо преобразование вниз по иерархии классов, то это признак плохой архитектуры, т.к. неверно передаются зависимости или неверно выделены интерфейсы или вы как-то неправильно работаете с библиотекой. Хотя, конечно бывают и исключения, но их немного.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы