Не определено поведение static_cast
для производного класса, когда объект на самом деле не относится к этому производному типу. Но неопределенное поведение означает, что все может случиться, в том числе и работать. (Или, кажется, работает сегодня, а затем терпит неудачу позже в самое неподходящее время.)
Так что это все, что нужно для официального объяснения с точки зрения языка C ++.
Но как почему это, вероятно, работает для типичного реального компилятора и компьютера: код для функции-члена на самом деле не хранится внутри объектов, так как это будет много байтов. Для не виртуальной функции в объекте даже нет указателя или чего-то подобного. Вместо этого компилятор будет реализовывать функцию Derived::B
, по существу, как функцию, не являющуюся членом:
void __mangled_Derived_B(Derived const* this) { /*...*/ }
Затем каждый раз, когда вызывается функция B
, он просто передает правильный указатель, чтобы стать " this
"аргумент.
В вашем примере Derived::B
на самом деле вообще не использует this
, даже неявно, поэтому проблемы маловероятны. Но если бы он попытался использовать элемент данных Derived
, все стало бы намного рискованнее, что могло привести к странным результатам, изменениям в других объектах или сбоям.