Vehicle** vehiclePtrPtr = carPtrPtr;
не допускается, потому что это преобразование Derived**
в Base**
, что недопустимо.
Причина, по которой это запрещено, проиллюстрирована на вашем примере.
Car car;
Car* carPtr = &car;
Car** carPtrPtr = &carPtr;
, так что carPtrPtr
указывает на указатель на Car
.
NuclearSubmarine sub;NuclearSubmarine * subPtr = ⊂
это также законно, но если бы вы могли сделать
Vehicle** vehiclePtrPtr = carPtrPtr;
, вы можете случайно сделать
*vehiclePtrPtr = subPtr;
, то есть *vehiclePtrPtr
указатель на Car
.с помощью этой последней строки вы назначаете ей указатель на Sub
.Таким образом, теперь вы можете вызывать метод, определенный в производном классе Sub
, для объекта типа Car
с неопределенным поведением.