C++的向上类型转换

        最近在看Stephen Prata 的C++ Primer Plus(经典中的经典,一本适合自学的书,强烈推荐给自学者),刚刚看到类的继承,继承这一章中有两个类型转换--向上类型转换和向下类型转换,书中是这样定义的(当然兄弟看的是中文版的):将派生类指针或引用转换为基类的指针或引用被称为向上类型转换",将基类指针或引用转换为派生类指针或引用被称为向下类型转换。对于像我这种有C语言基础,而且对C++已经研究过一段时间的人理解两个类型转换还是不在话下的。但是,让你目瞪口呆的东西说来就来啊,书中讲到向上类型转换是自动完成的,并且这就是基类指针或引用可以指向派生类对象的原因,尼玛,这怎么理解,完全超出我的认知啊。

class A
{
};

class B : public A
{
};

A a;
B b;
B * pb = &a;

          pb为派生类的指针,按照向上类型转换,难道pb这样就可以神不知鬼不觉的变成基类的指针A * 吗? 

        答案肯定是否定的,每个听过类继承的人肯定知道继承分为三种,公有继承、私有继承、保护继承,而公有继承中有一种关系叫is-a关系(基类A就相当于“水果”,而派生类B就相当于“苹果”,苹果是水果,但是水果不是苹果),这种关系表明,派生类对象可以看成一个基类对象,对基类对象可以执行的任何操作都可以对派生类对象执行,但是反过来就不可以,原因很简单,“水果”不是“苹果”,所以对“苹果”可以执行的操作不一定可以对“水果”执行,也就是说,想上面类似B * pb = &a这样的初始化本身就是错误的,违反C++语法规则,编译器通不过。

        那问题出在哪里呢?向上类型转换又是指的什么呢?为了说明这个问题,我们先引入两个概念:静态类型和动态类型。静态类型:是指不需要考虑表达式的执行期语义,仅分析程序文本而决定的表达式类型。动态类型:由一个左值表达式所表示的左值所引用的最终派生对象的类型。当然这里所说的静态类型和动态类型是对类指针或引用所说的。上面的概念也可以简单的理解为这样,静态类型:类指针或对象定义时的类型, 动态类型:类指针或对象所指向的派生类的类型。还有就是静态类型在定义的那一刻起就不能在改变了,但是动态类型却是可以改变的。正如下面这样:

A * pa = &a;       #1
    pa = &b;       #2

      在#1中pa的静态类型为A *,动态类型为A *,但到了#2中pa的静态类型为A *, 但是动态类型变成了B *。

      而我们上面所说的向上类型转换就是对类指针或引用的动态类型而言的。正如上面的pa的动态类型为B *,但是通过隐式的向上类型转换,自动将其动态类型转换为A *,所以对pa操作,还是相当于操作一个基类的对象。这就是为什么基类指针可以指向派生类对象的原因。然而向下类型转换不是自动完成的,所以不能将基类对象赋给派生类的指针或引用。

        最后,兄弟想谈一下“类型”,比如说,我们定义了一个into类型的变量a,我们都干了哪些事情呢?首选,我们确定了在内存中为其分配多大的内存,其次, 我们确定了如何解释这些内存,最后,我们确定了可以对其进行怎样的操作,比如可以对into类型进行加减乘除运算等------以上三点来自C++ Primer Plus。而由于继承导致了指针或引用有了两种类型------静态类型和动态类型,以兄弟理解,静态类型只是确定了以上三点中的前两点,而动态类型决定了第三点,即可以对其执行的操作。

         结尾兄弟声明一下,以上所写,只是一个C++菜鸟在遇到问题后,通过查资料,自己整理归纳所得,其中不免会有瑕疵,还请大神能够批评指正!同时作为一个C++爱好者,我也希望能够交到更多的朋友,相互学习,QQ:2501329505


  • 5
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值