C++中继承与多态和java中的继承与多态的区别

    因为现在有得开始使用java做课程设计了,发现自己都忘记的差不多了(诶,还是得多多练习哈。)然后,觉得为了突破语言的限制,还是得对比一下我已经学过的语言。这个将是我在大学做的一个长期工作。加油,加油,加油!!!

java中的继承

    java中的继承使用extends来实现的。继承的时候没有继承的方式限制,默认就是public 继承。那么,java中继承后实现访问控制的就是依据父类中的成员的访问权限来决定的。例如,在父类中有一个成员变量,private int a=10; 那么,你在继承这个父类之后,你在子类中也是没有办法来访问这个变量的。这得提醒大家一误区(可能仅仅只有我之前这么想过)。就是子类没有方法来访问父类的成员,并不是没有继承。也就是说,继承之后,所有的都会继承,没有继承不了的成员这个说法。继承的概念就是,子类会拥有父类所有成员,不管是成员变量还是成员函数。但是,拥有归拥有,能不能是使用就是另一个问题了。就好比你有你父辈那里传下来的一个一个宝藏图,但是没有破译上面文字的方法,那么你还是无法得到上面的宝藏。这里可以给大家看一下这个ideal编译器,在调试的时候,就可以充分说明这一点。
在这里插入图片描述
怎么看是否可以访问捏?直接看在子类中直接调用一个父类的private的时候,是否报错,报错说明是不可以引用的。看是看上图:
在这里插入图片描述
在这里插入图片描述
解决这个问题只要把父类中的访问权限设置为protected就好了,当然public也是可以的。

C++中的继承

    C++中继承的方式有public,protected,private继承。这里是和Java中不一样的。和java中的一样,C++中的继承也都是全部都会继承,这个也是之后C++中的多重继承中引发二义性的一个原因。能否调用就是子类对父类的访问权限的问题。不同的继承方式和原来父类成员的访问权限的组合,会导致子类的访问父类成员的问题。所以,一般来说,使用的还是public继承比较多。我觉得这个也是为什么java就将extends就设计为public的吧。

C++中的多态

    因为我觉得c++的多态复杂一点,所以先讲。之后,大家才能体会到java帮我们做了一些什么改变。

    C++中实现多态的前提条件。1.有继承;2.重写父类方法 ;3.该方法要被virtual修饰; 4.父类指针或者引用指向子类对象。有了这样的条件后,才可能出现多态。这里多讲一点我老师和我讲的C++的知识点,可能总结的不太对,希望大家多多指正。

        1.因为对于一个指针来说,是有自己的访问范围的。也就是说,一个int型指针只能访问4个字节的空间(假设是在sizeof(int)=4的电脑上),一个 struct student *p的指针,也仅仅只能访问sizeof(struct student)字节的空间。这里和指针仅仅只有4个字节是不相互冲突的(32位机器上)。这个应该是设计者在设计时的用意吧。

        2.我们只能将子类的对象赋值给基类的指针或者引用,此时他们就仅仅与子类对象的内存公用一小块地方。也很好理解,因为我子类对象成员至少是>=父类对象的,所以子类只给一部分给父类(这样好理解一点)。但是对于子类来说,你把父类对象给子类,子类还有很多成员变量没有值,所以这样的操作是不合法的。所以,这个也是为什么在c++中没有加上virtual关键字,你访问的只是子类从父类那里继承过来的函数。这里给出C++书本上的一幅图,就比较好理解了。
在这里插入图片描述
        但是现实生活中有这样的需求,我们的使用父类的指针或者引用去访问子类自己的函数。但是这个明显就违背了上面我们说的1,2点。但是为了实现这个功能,c++指定者们想到了是用来virtual函数来实现这个功能。至于虚函数实现大概的一个原理是什么,这个我也打算写一篇文章记录一哈。但是今天(2019.4.29)没有写。

    多态的好处大家可以看到了,因为对象本身我们是要在堆内存中开辟一段空间来使用的。但是,有时候我想要既可以访问子类成员,又可以访问父类成员。这个时候就是可以使用多态了!但是缺点就是不能访问子类特有的方法成员。从上面的拍的一张书本上的图可以看到,其实这个指针仅仅只能指向子类从父类那里继承过来的方法和变量。你要它能去动态的访问子类覆写的方法,这个时借助了虚函数。但是子类自己独有的一个函数,父类指针或者引用肯定时访问不到的。上图看:
在这里插入图片描述
可看到我上面的代码,我们可以使用强制转化就可以访问了。其实这个也就是Java中的向下转型。一开始学java的时候,还觉得这个名词好高级,还是自己太天真了。
在这里插入图片描述

java中的多态

    java中实现多态的前提条件。1.有继承;2.重写父类方法;3.父类引用指向子类对象。可以明显的看到,java中时不要你为函数申明virtual函数的。因为Java内部默认在继承中的函数都是虚函数。这样有好处,也有坏处。因为虚函数的实现,是需要虚表和虚指针的。这样子是会降低速度的。所以c++和c语言的执行速度也是比其他语言快的原因之一。

    其他的和C++区别不大。要访问子类特有的数据的时候也是得向下转型。这里还得注意一点:在C++和java中对于成员变量是没有多态性可言的。你如果一定要访问子类的成员,就得向下转型(c++中强制转化)不然的话,访问的肯定式父类的成员变量。也只有子类的对象赋值给父类的引用。在java中我相信很多老师都是这么说的,java中的多态:
成员函数:编译看左边,运行看右边。
成员变量:编译和运行都参考等号的左边。
静态成员:编译和运行都看左边。(其实对于静态成员没有必要使用对象引用来调用,直接类名调用就好。)
但是你看了我上面的分析,其实这三句话就不难理解了。

=========== 我觉得之后应该还有补充,先画一个分割线 ================

  • 8
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值