Мотивирующая предыстория: Пытаясь отладить трудновоспроизводимую неисправность в своем программном обеспечении, я наткнулся на сомнительный код приведения указателей, написанный наивным младшим разработчиком (ладно, признаю, это был я, 10 лет назад), что, как я подозреваю, может быть основной причиной неисправности.
Я переписал код, чтобы вместо этого использовать правильные вызовы static_cast<>
, и я не видел, чтобы возникало состояние ошибки после перезаписи, но это не обязательно означает что-либо, учитывая, что ошибка все равно возникает редко; Мне пока может просто везти.
Мой вопрос: вызывает ли преобразование указателей в стиле C, выполненное внутри main()
в приведенном ниже коде, неопределенное поведение? Или это просто некрасиво, но тем не менее хорошо сформировано с точки зрения юриста по языку?
#include <stdio.h>
#include <stdlib.h>
class BaseClass
{
public:
BaseClass() {}
virtual ~BaseClass() {}
virtual void Foo() {printf("BaseClass::Foo() called\n");}
};
class SubClassA : public BaseClass
{
public:
SubClassA() {}
virtual void Foo() {printf("SubClassA::Foo() called\n");}
};
class SubClassB : public BaseClass
{
public:
SubClassB() {}
virtual void Foo() {printf("SubClassB::Foo() called\n");}
};
int main(int, char **)
{
SubClassA a;
SubClassB b;
// Warning: questionable C-style casting follows...
BaseClass * p = (rand()%2) ? ((BaseClass*)(&a)) : ((BaseClass*)(&b));
p->Foo();
return 0;
}