Первое назначение в порядке, потому что компиляторы организуют всю память базового класса перед памятью производного класса. Таким образом, вы можете отклонять указатели, так как все поля базового класса по-прежнему будут указывать.
Второе присваивание не в порядке, поскольку Child
не наследуется от Unrelated
, и поэтому их расположение в памяти может будь другим. Компилятор отслеживает эти иерархии классов. Эти проверки происходят только во время компиляции.
Обратите внимание, что указатели апскейдинга могут быть опасными. Если ваш класс не является виртуальным, delete p
не вызовет деструктор производного класса, что приведет к потенциальным утечкам памяти. Если вы решите использовать upcast и delete
указатели, убедитесь, что вы делаете это для виртуальных классов.