问题转载自: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. 使用Maven的assembly插件实现自定义打包

    一.背景 最近我们项目越来越多了,然后我就在想如何才能把基础服务的打包方式统一起来,并且可以实现按照我们的要求来生成,通过研究,我们通过使用maven的assembly插件完美的实现了该需求,爽爆了有 ...

  2. Python3中性能测试工具Locust安装使用

    Locust安装使用: 安装: python3中           ---> pip3 install locust 验证是否安装成功---> 终端中输入 locust --help  ...

  3. 强化学习(七)时序差分离线控制算法Q-Learning

    在强化学习(六)时序差分在线控制算法SARSA中我们讨论了时序差分的在线控制算法SARSA,而另一类时序差分的离线控制算法还没有讨论,因此本文我们关注于时序差分离线控制算法,主要是经典的Q-Learn ...

  4. WebApiClient百度地图服务接口实践

    1. 文章目的 随着WebApiClient的不断完善,越来越多开发者选择WebApiClient替换原生的HttpClient,然而在应用到实际项目中多多少少会遇到一些项目结合上的疑问和困难,本文将 ...

  5. jsom快速入门

    JSON JSON: JavaScript Object Notation(JavaScript 对象表示法) JSON 是存储和交换文本信息的语法,具有自我描述性.类似 XML, 但比 XML 更小 ...

  6. Springboot 系列(七)Spring Boot web 开发之异常错误处理机制剖析

    前言 相信大家在刚开始体验 Springboot 的时候一定会经常碰到这个页面,也就是访问一个不存在的页面的默认返回页面. 如果是其他客户端请求,如接口测试工具,会默认返回JSON数据. { &quo ...

  7. 【译】最大限度地降低多线程 C# 代码的复杂性

    分支或多线程编程是编程时最难最对的事情之一.这是由于它们的并行性质所致,即要求采用与使用单线程的线性编程完全不同的思维模式.对于这个问题,恰当类比就是抛接杂耍表演者,必须在空中抛接多个球,而不要让它们 ...

  8. Django学习之十: staticfile 静态文件

    目录 Django学习之十: staticfile 静态文件 理解阐述 静态文件 Django对静态文件的处理 其它方面 总结 Django学习之十: staticfile 静态文件 理解阐述     ...

  9. 我的Python之旅第六天--面向对象初识

    一.概念 类:是具有相同属性的技能的一类实物 对象:实例化的一个类,是类的具体体现 class Person: '''内容''' animal='高级动物' soul='有思想' #animal,so ...

  10. 常见的网页图像格式有 ico、jpg、png、gif,说说他们各自的应用场景

    1.ico:一般作为网页的标题上面的图标出现,文件 favicon.ico一般存放在网站根目录 2.jpg:非常适合作为储存像素色彩丰富的图片.例如照片等等 3.png:分为 png-8 以及 png ...