相关疑难解决方法(0)

基类指针可以指向派生类对象.为什么反之亦然?

基类指针可以指向派生类对象.如果没有铸造,为什么反之亦然?逻辑上,基类没有足够的派生类信息,但派生类也应该具有基类的信息.我在这里遗漏了一些基础知识.

c++

67
推荐指数
4
解决办法
7万
查看次数

为什么派生类指针不能在没有强制转换的情况下指向基类对象?

在这里这里看到了很少有关于这类基本问题的宠物和狗类型的例子,但它们对我来说没有意义,这就是为什么.

假设我们有以下类结构

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对象!

很明显,我错过了一个关键点,这将使我的整个推理颠倒过来.你能告诉我它是什么吗?

我相信与现实世界的例子相似只会使事情复杂化.我希望从技术细节方面理解这一点.谢谢!

c++ inheritance pointers

7
推荐指数
2
解决办法
2万
查看次数

标签 统计

c++ ×2

inheritance ×1

pointers ×1