问题转载自:https://stackoverflow.com/questions/4937180/a-base-class-pointer-can-point-to-a-derived-class-object-why-is-the-vice-versa

看到这个问题,我的想法就是这不就是包含和被包含的关系吗,所以基类指针可以指向派生类对象,但是派生类指针不可以指向派生类对象。但是这又是为什么呢?这是理论上来回答这个问题,但是实现上呢?

下面有几个网友的回答:

1 jk.举了一个例子:如果你告诉我你有一只宠物狗,那我肯定知道你有一只宠物。但是你只告诉我你有一只宠物的话,我缺少信息去判断这只宠物到底是什么。同理,派生类是基类的一个子集,所以基类指针可以指向派生类对象;反之派生类指针不可以指向基类对象。

2 Bill Lynch给了两个类:

 class A {
int a;
}; class B : A{
int b;
};

实例化对象B,我们可以通过A*或者B*指向它;实例化A,如果我们通过B*指向它,那么成员b被分配的空间在哪里?

3 Puppy说,因为基类不等价于派生类。当有一个指向某类型的有效指针时,我们可以说被指向的对象有确定的空间存放着确切的数据,所以我们可以找到这个对象。如果有一个有效派生类指针,那么可以说被指向的对象包含派生类中的所有成员数据;但是用派生类指针指向基类对象时,将找不到派生类对象中自有的成员,这就将发生错误。

而且,派生类对象可以保证在相同的空间拥有基类所有的成员数据,这也是为什么基类指针可以指向派生类对象。

总结:

1) 理论上来说,基类包含派生类,派生类是基类的一个子集,所以基类指针可以指向派生类对象,反之则不成立,因为基类中缺少派生类中特有的成员和方法;

2)实现上来说,存放派生类对象的空间中包含基类的所有成员和方法还有自有的成员和方法,所以基类指针访问时派生类对象空间时,可以访问到相应的数据;但是派生类指针访问基类对象时,确缺少派生类中自有的成员和方法。

3)每一个问题都似乎有一个看起来简单、优雅但是确往往错误的答案,直觉就是导致这个答案的原因很大因素。所以当我们想问题时不要想当然,用正确的知识去分析它。

For every problem there is one solution which is simple, neat, but wrong. Intuitive answers often fall into this category.

A Base Class pointer can point to a derived class object. Why is the vice-versa not true?的更多相关文章

  1. 如何实现 Copying derived entities using only base class pointer

    #include <iostream> struct CloneableBase { ; }; template<class Derived> struct Cloneable ...

  2. [转] When exactly does the virtual table pointer (in C++) gets set for an object?

    PS: http://stackoverflow.com/questions/7934540/when-exactly-does-the-virtual-table-pointer-in-c-gets ...

  3. C++ 虚函数机制学习

    致谢 本文是基于对<Inside the c++ object model>的阅读和gdb的使用而完成的.在此感谢Lippman对cfront中对象模型的解析,这些解析帮助读者拨开迷雾.此 ...

  4. C++ Knowledge series 2

    Programming language evolves always along with Compiler's evolvement The semantics of constructors O ...

  5. c++多继承布局

    1:多重继承 对于一个继承了多个base class 的对象,将其地址指定给最左端(也就是第一个)base class的指针, 情况将和单一继承时相同,因为两者都指向相同的其实地址.至于第二个或者更后 ...

  6. [C++] OOP - Access Control and Class Scope

    Access Control And Inheritance Protected Member Like private, protected members are unaccessible to ...

  7. Pointer arithmetic for void pointer in C

    http://stackoverflow.com/questions/3523145/pointer-arithmetic-for-void-pointer-in-c When a pointer t ...

  8. [C++] OOP - Base and Derived Classes

    There is a base class at the root of the hierarchy, from which the other class inherit, directly or ...

  9. Smart Pointer Guidelines

    For Developers‎ > ‎ Smart Pointer Guidelines What are smart pointers? Smart pointers are a specif ...

随机推荐

  1. Java分布式锁,搞懂分布式锁实现看这篇文章就对了

    随着微处理机技术的发展,人们只需花几百美元就能买到一个CPU芯片,这个芯片每秒钟执行的指令比80年代最大的大型机的处理机每秒钟所执行的指令还多.如果你愿意付出两倍的价钱,将得到同样的CPU,但它却以更 ...

  2. ubuntu上配置nginx实现反向代理

    反向代理 反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客 ...

  3. 我的那些年(9)~我来团队了,Mvc兴起了

    回到目录 我的那些年(9)~我来团队了,Mvc兴起了 在一次后出办事后直接去面试了 面试就是答卷子 六里桥一个好地址 搬回老家了 在老婆的建议下学驾照了 拿到大专毕业证了 买车了 愉一切可以愉的时间学 ...

  4. Java~关于开发工具和包包

    大叔也学java了,距离上学时接触的java已经有10多年了,看着确实有些陌生了,不过还是希望学学,感受一下这个当今最牛X的语言!开发工具IDE对于一个语言来说是很必要的,就是Csharp使用vs一样 ...

  5. netstat命令总结

    nestat介绍 netstat是一款命令行工具,可用于列出系统上所有的网络套接字连接情况,包括 tcp, udp 以及 unix 套接字,另外它还能列出处于监听状态(即等待接入请求)的套接字. 使用 ...

  6. 极光推送经验之谈-Java后台服务器实现极光推送的两种实现方式

    原创作品,可以转载,但是请标注出处地址http://www.cnblogs.com/V1haoge/p/6439313.html Java后台实现极光推送有两种方式,一种是使用极光推送官方提供的推送请 ...

  7. ASP.NET Core 基于JWT的认证(一)

    ASP.NET Core 基于JWT的认证(一) Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC 7519).该token被设计 ...

  8. 解决在C#(.net)按字节数截取字符串最后出现乱码的问题

    最近需要用到按字节数截取字符串.在网上找了很多方法. Encoding.Default.GetString采用的DefaultEncoding.UTF8.GetBytes采用的是utf-8编码.这样当 ...

  9. Winform宽度与高度

    获取代码 非实时:一开始的宽度是多少就多少,拉宽了 获取的宽度还是刚开始的 ,同理高度 this.Width this.Height 获取代码 实时:调了窗体高度宽度,宽度 高度 也跟着变化,不再保持 ...

  10. Mysql使用event,类似oracle job

    MySQL从5.1开始支持event功能,类似oracle的job功能.有了这个功能之后我们就可以让MySQL自动的执行数据汇总等功能,不用像以前需要操作的支持了.如linux crontab功能. ...