Почему указатель производного класса не может указывать на объект базового класса без приведения типов?

Я видел несколько примеров типа домашних животных и собак для этого типа основного вопроса здесь и здесь , но они не имеют для меня смысла, вот почему.

Предположим, у нас есть следующая структура класса

class Pet {};
class Dog : public Pet {};

, тогда следующее утверждение

a (Dog) is a (Pet)

может быть верным в реальной жизни, но НЕ верно в C++] , на мой взгляд. Просто посмотрите на логическое представление объекта Dog, оно выглядит так:

enter image description here

Более уместно сказать

a (Pog) имеет (Pet)

или

a (Pet) is a подмножество (Собака)

, которое, если вы заметили, является логической противоположностью «Собака — домашнее животное»


Теперь проблема в том, что № 1 ниже разрешен, а № 2 — нет:

Pet* p = new Dog;  // [1] - allowed!
Dog* d = new Pet;  // [2] - not allowed without explicit casting!

Насколько я понимаю, что[1]нельзя разрешать без предупреждений, потому что указатель не может указывать на объект типа своего надмножества (объект Dog является надмножеством Pet) просто потому, что Pet ничего не знает о новых членах, которые Dog мог бы объявить (подмножество Dog-Pet на диаграмме выше).

[1]эквивалентно int*попытке указать на объект double!

Совершенно очевидно, что я упускаю здесь ключевой момент, который перевернул бы все мое рассуждение с ног на голову.Не могли бы вы сказать мне, что это такое?

Я считаю, что проведение параллелей с примерами из реального мира только усложняет ситуацию. Я бы предпочел понять это с точки зрения технических деталей. Спасибо!

7
задан Community 23 May 2017 в 10:30
поделиться