多态是指用父指针指向不同子类对象时,调用其共有的函数,不同的子类会有不同的行为。虽然C++和Java都具有多态机制,但是他们的实现不同,使用时的效果也会略有不同。

在C++中

  • 普通函数调用:具体调用哪个方法在编译时就可以决定(通过查找编译器的符号表),同时在使用标准过程调用机制基础上增加一个表示对象身份的指针(this指针)。
  • 虚函数调用:函数调用依赖于对象的实际类型,一般地说,对象的实际类型只能在运行时间才能确定。实现机制是使用virtual table(vtbls)和virtual table pointers(vptrs)。
    1. vtbl 是由函数指针构成的数组或链表,程序中每一个class凡声明(或继承)虚函数者,都有一个自己的vtbl,其中的条目就是该class的各个虚函数实现的指针。因此必须为每一个class消耗一个vtbl空间,其大小视虚函数的个数确定。
    2. 凡声明有虚函数的class,其对象都有一个隐藏的data member,用来指向class的vtbl。
    3. 当多态发生时,编译器首先根据对象vptr找出其vtbl,然后找出vtbl内对应的函数指针,最后调用函数指针指向的函数。从而实现多态。

在Java中

1.C++中VTable和vptr是在编译阶段由编译器自动生成的,也就是说,在C++程序载入内存以前,在.obj(.o)文件中已经有这些结构的信 息;Java中的方法表是由JVM生成的,因此,使用javac命令编译后生成的.class文件中并没有方法表的信息。只有等JVM把.class文件 载入到内存中时,才会为该.class文件动态生成一个与之关联的方法表,放置在JVM的方法区中。
2. C++中某个方法在VTable的索引号是在编译阶段已经明确知道的,并不需要在运行过程中动态获知;Java中的方法初始时都只是一个符号,并不是 一个明确的地址,只有等到该方法被第一次调用时,才会被解析成一个方法表中的偏移量,也就是说,只有在这个时候,实例方法才明确知道自己在方发表中的偏移 量了,在这之前必须经历一个解析的过程。

因此在构造函数是Java会发生多态,即使子类此时还没有构造完全(一个极难发现的bug)。而C++则不会发生多态,待父类构造完全,在构造子类。
Java代码如下:

public class A {public void fun(){System.out.println("A");}public A(){this.fun();}
}
public class B extends A{public void fun(){System.out.println("B");}public B(){fun();}public static void main(String [] argv){B b = new B();}
}
//B
//B

C++代码如下:

#include <iostream>
#include <string>
#include <cstring>
#include <cstdlib>
using namespace std;
class A
{public:virtual void fun(){cout<<"A"<<endl;}A(){fun();}
};
class B : A
{public:virtual void fun(){cout<<"B"<<endl;}B(){fun();}};
int main(int argc, char *argv[])
{B b;
}
//A
//B

可以发现,C++构造子类时,先构造父类,输出A,然后在构造自身,输出B。而Java在构造子类时,父类并未构造完成,但已经可以发生多态输出B,然后再构造自身,输出B。Java一般为了避免这种情况,会把fun等init()函数声明为private或者finial。

转载于:https://www.cnblogs.com/jostree/p/4873686.html

C++与Java多态的区别相关推荐

  1. 笔记1——C++多态与Java多态的异同

    最近参加网易笔试遇到一个问题,考察了C++ 多态特性,自己查了相关资料学习了相关用法. 一般程序调用的函数地址是在编译期决定了,但是具有多态特性的函数调用地址是在程序运行期才决定. C++与Java多 ...

  2. java多态的实现_Java多态的实现机制是什么,写得非常好!

    作者:crane_practice www.cnblogs.com/crane-practice/p/3671074.html 2019-06-13 08:46:00 Java多态的实现机制是父类或接 ...

  3. 深入理解java多态没有烤山药的存在,java就不香了吗?

    文章目录 1. 从吃烤山药重新认识多态 2. 多态前提条件[重点] 3. 多态的体现 4. 多态动态绑定与静态绑定 4.1.静态绑定(前期绑定) 4.2.动态绑定(后期绑定) 4.3.静态.动态绑定本 ...

  4. Java多态与泛型 ,动态绑定,静态绑定

    文章目录 (一)多态 1.概念 1.1 使用继承: 1.2 实现接口(推荐): 2.作用 3.多态的实现原理 3.1 Java 动态绑定以及内部实现机制 程序绑定的概念 关于final.static. ...

  5. JAVA多态/封装/接口/包/包的命名规则——java面向对象

    Java 多态 多态是同一个行为具有多个不同表现形式或形态的能力. 多态的优点 消除类型之间的耦合关系 可替换性 可扩充性 接口性 灵活性 简化性 多态存在的三个必要条件 继承 重写 父类引用指向子类 ...

  6. Java多态 和 Python多态

    Java多态和Python多态 ava中的多态跟Python中的多态是有区别的. java中的多态定义: 多态存在的三个必要条件 一.要有继承: 二.要有重写: 三.父类引用指向子类对象 java 多 ...

  7. java多态编译,java多态 运行时多态和编译时多态

    java多态 运行时多态和编译时多态 我们知道java的多态是一个重要的特性,其中体现java的多态有两种形式.运行时的多态和编译时的多态. 编译时的多态会发生在方法重载的时候,方法的重载指方法名相同 ...

  8. Java多态是什么,怎么实现的,多态例子代码

    目录 子类型和子类 多态分两种 多态的用途 多态的转型 运行时多态的例子 多态实现的机制 JVM 部分内容摘自: Java多态的实现机制是什么,写得非常好!_Java技术栈的博客-CSDN博客 子类型 ...

  9. 【一篇理清】C语言/C++/C#,及JAVA/Python的区别在什么地方?【建议收藏】

    目录 首先来说一下C语言和C++.C#的区别在什么地方 C C++ C# Python C是最基础的编程语言你同意吗? 其中C++则一般看作是对C语言的扩展. Java语言是一种完全的面向对象语言,虽 ...

最新文章

  1. 都说百度前端牛,来看看百度前端工程化之H5性能优化
  2. Storyboard更改layer层属性
  3. WinCE启动失败的原因与解决办法分析
  4. find -exec 与xargs 区别
  5. my02_Atlas mysql5.7安装配置
  6. [trustzone]-ARMV8的aarch64和aarch32环境下ELx级别的理解
  7. linux定时器跑命令,linux下运行定时器(cron/centos/js脚本)
  8. c语言ip地址转16进制,点分十进制形式的ip地址转化为十六进制数
  9. html表单 新页面打开新页面,js提交表单并打开新页面的方法
  10. python画图-python绘图入门(完整版)
  11. PerformanceTest
  12. cnzz.php,CNZZ站长统计代码报错解决方法
  13. Jib使用小结(Maven插件版)
  14. 卷积神经网络中特征图大小计算公式总结
  15. jenkins cicd k8s 多分支流水线构建
  16. MAC MacVim及Vundle安装
  17. science最新研究动态周报(2021年5月26期)
  18. 新一代的JAVAEE jakartaEE 容器实现 payara使用(二)
  19. 江西理工大学JSP程序设计第一二章期末复习
  20. 【Java大数据】Java基础

热门文章

  1. 魅族8.0系统手机最完美激活xposed框架的步骤
  2. Python os.path模块的使用
  3. Android逆向:二进制xml文件解析 之 Start Tag Chunk
  4. python全栈开发_day52_html模板继承和静态配置
  5. BZOJ3133[Baltic2013]ballmachine
  6. 通过数据库动态视图'v$',查看数据库信息
  7. js中的鼠标滚轮事件
  8. 第四次工业革命:人工智能(AI)入门
  9. HDU ACM 1078 FatMouse and Cheese 记忆化+DFS
  10. C# ASP.NET MVC HtmlHelper用法大全