问题转载自: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. 【Android Studio安装部署系列】三十四、将Eclipse项目导入到Android Studio中

    版权声明:本文为HaiyuKing原创文章,转载请注明出处! 概述 我采用的是笨方法:新创建Android Studio项目,然后将Eclipse项目中的目录一一复制到Android Studio项目 ...

  2. springboot~lombok使用总结

    @Getter & @Setter 生成getter和setter块 @Data注解 @Data相当于@Getter @Setter @RequiredArgsConstructor @ToS ...

  3. 接口自动化:HttpClient + TestNG + Java(三) - 初步封装和testng断言

    在上一篇中,我们写了第一个get请求的测试类,这一篇我们来对他进行初步优化和封装 3.1 分离请求发送类 首先想到的问题是,以后我们的接口自动化测试框架会大量用到发送http请求的功能. 那么这一部分 ...

  4. 开箱即用(out-of-box)的Redis序列号生成器,不用再写任何代码,你值得拥有

      先看整体效果 把简单的东西“傻瓜化”是软件开发追求的目标之一.请看下图: 左边是在 application.yml 里配置了3个生成器,右边可以直接注入到代码中使用,注意,不用写任何代码.这酸爽. ...

  5. DSAPI 字符串和文件转Md5字符串

    方法列表: 字符串转MD5字符串(ByVal 要转换的字符串 As String, Optional 转换格式 As MD5格式 = MD5格式.小写32位) As String 文件转MD5字符串( ...

  6. DSAPI 远程协助之获取当前鼠标指针坐标及样式

    在编写远程协助类软件时,除了获取屏幕画面外,还需要获取鼠标当前的坐标以及当前的指针样式,以便让远程屏幕知道当前的操作状态. 使用DSAPI内置的鼠标指针类,可轻松获取. 代码如下: Imports D ...

  7. 项目开发过程中什么是开发环境、测试环境、生产环境、UAT环境、仿真环境?

    项目开发过程中什么是开发环境.测试环境.生产环境.UAT环境.仿真环境? 最近在公司项目开发过程中总用到测试环境,生产环境和UAT环境等,然而我对环境什么的并不是很理解它的意思,一直处于开发阶段,出于 ...

  8. 【Redis】LRU算法和Redis的LRU实现

    LRU原理 在一般标准的操作系统教材里,会用下面的方式来演示 LRU 原理,假设内存只能容纳3个页大小,按照 7 0 1 2 0 3 0 4 的次序访问页.假设内存按照栈的方式来描述访问时间,在上面的 ...

  9. 数据库缓存mybatis,redis

    简介 处理并发问题的重点不在于你的设计是怎样的,而在于你要评估你的并发,并在并发范围内处理.你预估你的并发是多少,然后测试r+m是否支持.缓存的目的是为了应对普通对象数据库的读写限制,依托与nosql ...

  10. webpack中使用DefinePlugin定义全局变量

    DefinePlugin可以在编译时期创建全局变量.DefinePlugin是webpack注入全局变量的插件,通常使用该插件来判别代码运行的环境变量.