基类指针可以指向派生类对象.如果没有铸造,为什么反之亦然?逻辑上,基类没有足够的派生类信息,但派生类也应该具有基类的信息.我在这里遗漏了一些基础知识.
我在这里和这里看到了很少有关于这类基本问题的宠物和狗类型的例子,但它们对我来说没有意义,这就是为什么.
假设我们有以下类结构
class Pet {};
class Dog : public Pet {};
Run Code Online (Sandbox Code Playgroud)
然后是以下声明
a (Dog) is a (Pet)
在我的观点中,在现实生活中可能是真的,但在C++中却不是这样.只需看看Dog对象的逻辑表示,它看起来像这样:

更合适的说法
a (Dog) has a (Pet)
要么
a (Pet) is a subset of (Dog)
如果你注意到它与"狗是宠物"的逻辑相反
现在的问题是,#2不允许下面的#1:
Pet* p = new Dog; // [1] - allowed!
Dog* d = new Pet; // [2] - not allowed without explicit casting!
Run Code Online (Sandbox Code Playgroud)
我的理解是不[1]应该在没有警告的情况下被允许,因为指针不应该能够指向其超集类型的对象(Dog对象是Pet的超集),因为Pet对新成员一无所知狗可能已经宣布(上图中的狗 - 宠物子集).
[1]相当于int*试图指向一个double对象!
很明显,我错过了一个关键点,这将使我的整个推理颠倒过来.你能告诉我它是什么吗?
我相信与现实世界的例子相似只会使事情复杂化.我希望从技术细节方面理解这一点.谢谢!