Так что я пытаюсь узнать немного больше о различиях между C-стиль-проливает, static_cast, dynamic_cast и я решил попробовать этот пример, который должен отражать различия между C-стиль-бросает и static_cast довольно хорошо.Метод вызова после того, как недействительный гипсе C-стиль работы
class B
{
public:
void hi() { cout << "hello" << endl; }
};
class D: public B {};
class A {};
int main()
{
A* a = new A();
B* b = (B*)a;
b->hi();
}
Ну этот фрагмент кода должен отражать, что C-стиль литья идет очень неправильно и плохо литая не обнаруживается вообще. Частично это происходит именно так. Плохой приказ не обнаружен, но я был удивлен, когда программа, а не сбой в b->hi();
, напечатала на экране слово «привет».
Теперь, почему это происходит? Какой объект использовался для вызова такого метода, когда объект B не создан? Я использую g ++ для компиляции.
Кастинг для несвязанного типа, подобного этому (что фактически является 'reinterpret_cast' в C++), является неопределенным поведением. Это означает, что реализация может делать все, что захочет. – Yuushi
СОВЕТ: даже сломанные часы показывают правильное время два раза в день. –
C style cast похож на программиста, говорящего компилятору «Поверьте мне, это B-объект». У компилятора нет выбора, кроме как согласиться. То, что происходит, когда оно выполняется, не определено. Именно поэтому c-отливки стиля настолько опасны. –