Я знаю, что разрешено использовать dynamic_cast
для "перекрестного преобразования" по иерархии классов. Например, если у меня есть классы, которые выглядят так:
A B
\ /
C
Если у меня есть указатель A*
, указывающий на объект типа C
, тогда я могу использовать
A* aPtr = /* ... something that produces a C* ... */
B* bPtr = dynamic_cast<B*>(aPtr);
чтобы получить указатель на B
базовый объект C
, на который я указываю.
Причина, по которой я упоминаю это, заключается в том, что во время написания приведенного выше кода, возможно, что компилятор еще не видел определения C
, хотя он видел A
и B
. Это означает, что возможно, что компилятор не обнаружит никакой связи между A
и B
, но ему все равно придется скомпилировать код в любом случае, потому что существует возможность существования класса, подобного C
, и dynamic_cast
чтобы преуспеть при некоторых обстоятельствах.
Проблема в том, что это означает, что я могу случайно выполнить перекрестную приведение к объекту неправильного типа. Предположим, у меня есть классы, которые выглядят так:
A B D
\ /
C
Здесь D
- некоторый случайный не связанный класс. Если я попытаюсь написать что-то вроде этого:
A* aPtr = /* ... get a C* pointer ... */
D* dPtr = dynamic_cast<D*>(aPtr);
Тогда этот dynamic_cast
всегда будет сбой во время выполнения, так как нет никакого способа соединить A
и D
. Если я использую D
случайно, потому что я намеревался использовать B
, компилятор не даст мне никаких указаний на то, что у меня есть бессмысленное приведение.
Мой вопрос: есть ли способ заставить компилятор предупредить меня о том, что приведение всегда будет неудачным во время выполнения? Я был бы рад решению на уровне языка или некоторой настройке компилятора для любого крупного компилятора, который мог бы обнаружить это. Если есть внешний инструмент, это тоже хорошо; Я просто хочу знать, возможно ли отловить этот класс ошибок.