Я видел несколько примеров типа домашних животных и собак для этого типа основного вопроса здесь и здесь , но они не имеют для меня смысла, вот почему.
Предположим, у нас есть следующая структура класса
class Pet {};
class Dog : public Pet {};
, тогда следующее утверждение
a (Dog) is a (Pet)
может быть верным в реальной жизни, но НЕ верно в C++] , на мой взгляд. Просто посмотрите на логическое представление объекта Dog, оно выглядит так:
Более уместно сказать
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
!
Совершенно очевидно, что я упускаю здесь ключевой момент, который перевернул бы все мое рассуждение с ног на голову.Не могли бы вы сказать мне, что это такое?
Я считаю, что проведение параллелей с примерами из реального мира только усложняет ситуацию. Я бы предпочел понять это с точки зрения технических деталей. Спасибо!