C++与Java多态的区别
多态是指用父指针指向不同子类对象时,调用其共有的函数,不同的子类会有不同的行为。虽然C++和Java都具有多态机制,但是他们的实现不同,使用时的效果也会略有不同。
在C++中
- 普通函数调用:具体调用哪个方法在编译时就可以决定(通过查找编译器的符号表),同时在使用标准过程调用机制基础上增加一个表示对象身份的指针(this指针)。
- 虚函数调用:函数调用依赖于对象的实际类型,一般地说,对象的实际类型只能在运行时间才能确定。实现机制是使用virtual table(vtbls)和virtual table pointers(vptrs)。
- vtbl 是由函数指针构成的数组或链表,程序中每一个class凡声明(或继承)虚函数者,都有一个自己的vtbl,其中的条目就是该class的各个虚函数实现的指针。因此必须为每一个class消耗一个vtbl空间,其大小视虚函数的个数确定。
- 凡声明有虚函数的class,其对象都有一个隐藏的data member,用来指向class的vtbl。
- 当多态发生时,编译器首先根据对象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——C++多态与Java多态的异同
最近参加网易笔试遇到一个问题,考察了C++ 多态特性,自己查了相关资料学习了相关用法. 一般程序调用的函数地址是在编译期决定了,但是具有多态特性的函数调用地址是在程序运行期才决定. C++与Java多 ...
- java多态的实现_Java多态的实现机制是什么,写得非常好!
作者:crane_practice www.cnblogs.com/crane-practice/p/3671074.html 2019-06-13 08:46:00 Java多态的实现机制是父类或接 ...
- 深入理解java多态没有烤山药的存在,java就不香了吗?
文章目录 1. 从吃烤山药重新认识多态 2. 多态前提条件[重点] 3. 多态的体现 4. 多态动态绑定与静态绑定 4.1.静态绑定(前期绑定) 4.2.动态绑定(后期绑定) 4.3.静态.动态绑定本 ...
- Java多态与泛型 ,动态绑定,静态绑定
文章目录 (一)多态 1.概念 1.1 使用继承: 1.2 实现接口(推荐): 2.作用 3.多态的实现原理 3.1 Java 动态绑定以及内部实现机制 程序绑定的概念 关于final.static. ...
- JAVA多态/封装/接口/包/包的命名规则——java面向对象
Java 多态 多态是同一个行为具有多个不同表现形式或形态的能力. 多态的优点 消除类型之间的耦合关系 可替换性 可扩充性 接口性 灵活性 简化性 多态存在的三个必要条件 继承 重写 父类引用指向子类 ...
- Java多态 和 Python多态
Java多态和Python多态 ava中的多态跟Python中的多态是有区别的. java中的多态定义: 多态存在的三个必要条件 一.要有继承: 二.要有重写: 三.父类引用指向子类对象 java 多 ...
- java多态编译,java多态 运行时多态和编译时多态
java多态 运行时多态和编译时多态 我们知道java的多态是一个重要的特性,其中体现java的多态有两种形式.运行时的多态和编译时的多态. 编译时的多态会发生在方法重载的时候,方法的重载指方法名相同 ...
- Java多态是什么,怎么实现的,多态例子代码
目录 子类型和子类 多态分两种 多态的用途 多态的转型 运行时多态的例子 多态实现的机制 JVM 部分内容摘自: Java多态的实现机制是什么,写得非常好!_Java技术栈的博客-CSDN博客 子类型 ...
- 【一篇理清】C语言/C++/C#,及JAVA/Python的区别在什么地方?【建议收藏】
目录 首先来说一下C语言和C++.C#的区别在什么地方 C C++ C# Python C是最基础的编程语言你同意吗? 其中C++则一般看作是对C语言的扩展. Java语言是一种完全的面向对象语言,虽 ...
最新文章
- 都说百度前端牛,来看看百度前端工程化之H5性能优化
- Storyboard更改layer层属性
- WinCE启动失败的原因与解决办法分析
- find -exec 与xargs 区别
- my02_Atlas mysql5.7安装配置
- [trustzone]-ARMV8的aarch64和aarch32环境下ELx级别的理解
- linux定时器跑命令,linux下运行定时器(cron/centos/js脚本)
- c语言ip地址转16进制,点分十进制形式的ip地址转化为十六进制数
- html表单 新页面打开新页面,js提交表单并打开新页面的方法
- python画图-python绘图入门(完整版)
- PerformanceTest
- cnzz.php,CNZZ站长统计代码报错解决方法
- Jib使用小结(Maven插件版)
- 卷积神经网络中特征图大小计算公式总结
- jenkins cicd k8s 多分支流水线构建
- MAC MacVim及Vundle安装
- science最新研究动态周报(2021年5月26期)
- 新一代的JAVAEE jakartaEE 容器实现 payara使用(二)
- 江西理工大学JSP程序设计第一二章期末复习
- 【Java大数据】Java基础
热门文章
- 魅族8.0系统手机最完美激活xposed框架的步骤
- Python os.path模块的使用
- Android逆向:二进制xml文件解析 之 Start Tag Chunk
- python全栈开发_day52_html模板继承和静态配置
- BZOJ3133[Baltic2013]ballmachine
- 通过数据库动态视图'v$',查看数据库信息
- js中的鼠标滚轮事件
- 第四次工业革命:人工智能(AI)入门
- HDU ACM 1078 FatMouse and Cheese 记忆化+DFS
- C# ASP.NET MVC HtmlHelper用法大全