потому что void* ничего не знает про множественное наследование
а по подробнее можно?
выведи static_cast<void*>(&a) и static_cast<void*>(static_cast<I_WriteDM*>(&a)), поймёшь
если моё предположение верно, то там как минимум будут разные адреса. если одинаковые, возможно, я не прав
да все так,но почему разние?
так устроено наследование, в частности множественное ¯\_(ツ)_/¯
А почитать об етом где можна?
я не буду пугать обрывками стандарта, поэтому советую загуглить что-то вроде "c++ class layout multiple inheritance"
да я сам не знаю, по какой конкретно формулировке искать ответ
вы написали код так, что у вас вместо upcast ( conv.ptr#3) получается простое преобразование void* в указатель на объект (expr.static.cast#13). само по себе это ничем не чревато, но вместо адреса родительского подобъекта вы получите адрес исходного объекта, и это если выравнивание совпадет. а если не совпадет, то вы вообще неизвестно что получите дальше вы вызываете метод через получившийся указатель (и тут я удивительным образом не нахожу в стандарте, почему с полиморфными классами так делать нельзя), а дальше в какой-то момент нарушается strict aliasing rule (basic.lval#11), потому что this будет не того типа если выравнивание не совпало, то UB уже на самом факте вызова (class.mfct.non-static#2)
полтора часа пытался найти, почему upcast указателей на полиморфные объекты путем reinterpret_cast'а это плохо, ну или хотя бы почему плохо вызывать виртуальные методы через результат такого преобразования, но в итоге пришлось через strict aliasing идти (предыдущее сообщение)
спасибо за труд
Спасибо, интересно
Обсуждают сегодня