问题转载自: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. DeviceUuidFactory【获取设备唯一标识码的UUID(加密)】【需要运行时权限的处理的配合】

    版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 有时需要对用户设备进行标识,所以希望能够得到一个稳定可靠并且唯一的识别码.虽然Android系统中提供了这样设备识别码,但是由于An ...

  2. spring里的三大拦截器

    Filter 新建 TimeFilter @Component public class TimeFilter implements Filter { @Override public void in ...

  3. 《Unity3D/2D游戏开发从0到1》正式出版发行

    <Unity3D/2D游戏开发从0到1>正式出版发行 去年个人编写的Unity书籍正式在2015年7月正式发行,现在补充介绍一下个人著作.书籍信息:      书籍的名称: <Uni ...

  4. MySQL集群架构:MHA+MySQL-PROXY+LVS实现MySQL集群架构高可用/高性能-技术流ken

    MHA简介 MHA可以自动化实现主服务器故障转移,这样就可以快速将从服务器晋级为主服务器(通常在10-30s),而不影响复制的一致性,不需要花钱买更多的新服务器,不会有性能损耗,容易安装,不必更改现有 ...

  5. 深入理解 Python 中的上下文管理器

    提示:前面的内容较为基础,重点知识在后半段. with 这个关键字,对于每一学习Python的人,都不会陌生. 操作文本对象的时候,几乎所有的人都会让我们要用 with open ,这就是一个上下文管 ...

  6. PHP基础笔记

    今天一个阳光明媚的大周天,小崔百无聊赖的翻看着各种老旧的经典电影,无奈谁让自己是没女朋友的单身狗呢.闲来无事就记录一下PHP的一些基础知识吧! 1.PHP是什么? PHP是一种创建动态交互性站点的服务 ...

  7. String-StringBuffer-StringBuilder的区别和源码分析

    一,String,StringBuffer,StringBuilder三者之间的关系 三个类的关系:StringBuffer和StringBuilder都继承自AbstractStringBuilde ...

  8. c#调用word文件

    大家好!我叫蓝颜,我是一名大专生.这是我第一次接触博客园,以后也会一直在. 在学校期间,参加技能大赛(物联网),接触到的C#.之后学校教务处要一个调课软件, 于是我就小试牛刀试了试.当然了,这也是我第 ...

  9. 模板引擎artTemplate的使用

    1.引入template文件 <script src = js/template-native.js></script> 2.写模板 <script type=" ...

  10. 微信小程序 选择微信自带的地址 用户授权选择了拒绝

    // 选择微信自带地址 addAddr:function () { wx.chooseAddress({ success: function (res) { self.setData({ addrIn ...