Разве указатель не указывает на начало объекта?В каком случае как будут отличаться два указателя?
Если вы передадите указатель на объект B
на func(A* pVal)
, то внутри реализации func()
указатель pVal
будет указыватьв часть A
подобъекта объекта B
.Не определено, будут ли они находиться в одном и том же месте (хотя для простой ситуации наследования, как в вашем примере, это почти наверняка будет).
Если подобъект A
на самом деле имеет другое смещение (что может потребоваться, например, в случае множественного наследования), тогда компилятор автоматически выполнит соответствующую настройку при компиляции вызова.Компилятор может сделать это, потому что на сайте вызовов он знает, что имеет дело с B*
, и ему нужно преобразовать его в A*
, чтобы перейти к func()
.Это безопасное и нормальное преобразование, поскольку B
публично наследуется от A
.