问题转载自: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. LongLightUtils【保持屏幕常亮工具类】

    版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 这里只是简单记录下保持屏幕常亮工具类LongLightUtils的使用,具体请阅读参考资料<Android屏幕常亮,其实很简单 ...

  2. 『集群』006 Slithice 后期改进 和 Slithice可能存在的BUG

    Slithice 后期改进 和 Slithice可能存在的BUG Slithice 可能存在的 BUG: >Slithice 暂时 没有 对 循环调度 进行控制:不正确的 配置 可能导致 调度死 ...

  3. 前端笔记之移动端&响应式(中)视口&百分比布局&弹性盒模型&rem&fillpage

    一.viewport视口 1.1什么是屏幕尺寸.屏幕分辨率.屏幕像素密度? 屏幕尺寸:指屏幕的对角线的长度,单位是英寸,常见的屏幕尺寸有3.5.3.7.4.2.4.7.5.0.5.5.6.0等. 屏幕 ...

  4. [翻译] EF Core 概述

    Entity Framework Core in Action Entityframework Core in action是 Jon P smith 所著的关于Entityframework Cor ...

  5. 如何让vue自定义组件可以包裹内容,并且渲染出来,以及组件的组合使用

    当我们用vue一开始写项目时,按需求文档自定义了一个公用组件,这个组件很多地方都用到了,然后随着项目的推进,又有了新的需求要在里面加东西,但又不是所有的地方都要加 这时候我们想这样往里面塞内容↓    ...

  6. Linux最小系统移植之早期打印CONFIG_DEBUG_LL

    一.几个关键宏定义 CONFIG_DEBUG_LL. CONFIG_DEBUG_LL_INCLUDE 容我慢慢道来, 首先要使能早期打印, menuconfig必须选中CONFIG_DEBUG_LL, ...

  7. 并发系列(2)之 ThreadLocal 详解

    本文将主要结合源码讲述 ThreadLocal 的使用场景和内部结构,以及 ThreadLocalMap 的内部结构:另外在阅读文本之前只好先了解一下引用和 HashMap 的相关知识,可以参考 Re ...

  8. python3-随机生成10位包含数字和字母的密码

    方法一: 知识点:random.sample(sequence, k) 从指定序列中随机获取指定长度的片断 import random,string num=string.ascii_letters+ ...

  9. docker(3)容器管理命令

    接着上一篇,今天说一下Docker 有关容器的常用命令.算是比较详细了吧. docker run  命令: 注:此命令作用是使用一个镜像运行启动一个容器. 在启动运行的时候 会检查docker 中是否 ...

  10. iOS视频边下载边播放

    随着视频行业的发展,很多用户对于观看体验也有了更高的要求,以前的习惯是下载好了在观看,而现在是希望1分钟都不要等,ZUI好一边看着一边下载,等把这个视频看完也下载完了,也就是我们常说的“视频边下载边播 ...