C++ 和 Java 对类继承的差异
#include <iostream>
using namespace std; class Base
{
public:
int i; Base()
{
i = ;
fun();
} virtual void fun()
{
cout<<"Base.fun()"<<endl;
} }; class Derived : public Base
{
public:
int i; Derived() {
i = -;
} virtual void fun()
{
cout<<"Derived.fun()"<<endl;
} }; int main(int argc, char *argv[])
{
Base *b = new Derived();
cout<<(b->i)<<endl;
b->fun();
}

java 代码:
class Base
{
int i = 9999; public void fun()
{
System.out.println("Base.fun()");
} Base()
{
fun();
}
} class Derived extends Base
{
int i = -1;
Derived(){} public void fun()
{
System.out.println("Derived.fun()");
}
} public class dev
{
public static void main(String argv[])
{
Base b = new Derived();
System.out.println(b.i);
b.fun();
}
}

差异体现在第一行输出;
这行是在Derived的构造函数中输出的,Derived本身没有构造函数,它只调用父类的构造函数,即Base的Base(), 并执行其中的 fun() 函数;
对于C++代码,执行的是Base::fun();
对于Java代码,执行的是Derived::fun();
为什么呢,在C++中调用基类的fun时,此时子类还没有准备好,故执行的是基类的fun。
分析:区别原因在于编译器,及其运行原理
C++ 代码 经过编译后 Base构造函数中的代码为静态,其中调用的其他函数地址也已经在编译时 就已经确定, 故执行的是 Base::fun() 。(除了虚函数是动态联编其他的都是静态代码)
Java 代码,为动态联编, 各个函数在编译时已经形成虚拟机机器指令代码, 但是具体的函数调用却是动态的, 因为是派生类调用父类的构造函数,所以这里的 fun() 函数被认为是 派生类 derived 中的。
C++ 和 Java 对类继承的差异的更多相关文章
- java一个类 继承HttpServlet 和实现Servlet区别
java一个类 继承HttpServlet 和实现Servlet区别 servlet 是一个接口,如果实现这个接口,那么就必须实现接口里面定义的所有方法 而HttpServlet实现了servlet接 ...
- Java的类继承
知识点1.继承作用:提高代码的重用性,继承之后子类可以继承父类中的属性和方法减少重复代码条件:子类和父类要满足is a的逻辑关系,才能使用继承.如:苹果 is a水果语法:使用extends 连接子类 ...
- java的类继承(与c++对比)
1. interface的引入 使用interface来定义某一类通用操作,而又不强制规定其实现,对于Java的流行真是太重要了. 以JDBC举例.在Java之前,C++与数据库建立连接,常用的一个技 ...
- 【JAVA】类继承对父类静态变量的操作
对静态变量的操作存在继承时还是有一些模糊,做了个简单的测试: class Test { private String mName; public Test(String name) { setName ...
- java基础 类 & 继承
类 在Java中,类文件是以.java为后缀的代码文件,在每个类文件中可以有多个类,但是最多只允许出现一个public类,当有public类的时候,类文件的名称必须和public类的名称相同,若不存在 ...
- Java: 类继承中 super关键字
super 关键字的作用有两个: 1)在子类中调用超类的构造器,完成实例域参数的初始化,调用构造器的语句只能作为另一个构造器(通常指的是子类构造器)的第一条语句出现, 2)在子类中调用超类的方法,如: ...
- (转)Java:类与继承
原文地址: http://www.cnblogs.com/dolphin0520/p/3803432.html 对于面向对象的程序设计语言来说,类毫无疑问是其最重要的基础.抽象.封装.继承.多态这四大 ...
- Java:类与继承
Java:类与继承 对于面向对象的程序设计语言来说,类毫无疑问是其最重要的基础.抽象.封装.继承.多态这四大特性都离不开类,只有存在类,才能体现面向对象编程的特点,今天我们就来了解一些类与继承的相关知 ...
- Java:验证在类继承过程中equals()、 hashcode()、toString()方法的使用
以下通过实际例子对类创建过程汇中常用的equals().hashcode().toString()方法进行展示,三个方法的创建过程具有通用性,在项目中可直接改写. //通过超类Employee和其子类 ...
随机推荐
- Springboot 学习遇到的一些错和埋坑之旅
1. java.lang.IllegalStateException: Unable to find a @SpringBootConfiguration, you need to use @Cont ...
- C++反汇编书
1. <C++反汇编与逆向分析技术揭秘> 2.
- vs2010的VCVARS32.BAT所在位置
1. C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin\vcvars32.bat 2. ZC:vs08 和 vs2010 安装好后, ...
- 对不队—— Alpha冲刺
第三天 日期:2018/6/18 一. 今日完成任务:会议内容管理部分 冯晓.马思远:会议网站栏目管理开发,博客撰写 王爽.彭辉:参会人员管理开发 吴琼.郝延婷:审稿专家管理开发 1.1会议管理界面 ...
- webpack 集成 jQuery 和 Avalon
webpack 系列 三:webpack 如何集成第三方js库 webpack系列目录 webpack 系列 一:模块系统的演进 webpack 系列 二:webpack 介绍&安装 webp ...
- 网站链接facebook 拿新的post
$http({ method: "GET", url: "https://graph.facebook.com/oauth/access_token?client_id= ...
- android--------WebView实现 Html5 视频标签加载
自Android 4.4起,Android中的WebView开始基于Chromium(谷歌浏览器)支持浏览器的一系列功能,webkit解析网页各个节点,这个改变,使得WebView的性能大幅度提升,并 ...
- hdu 1069 DAG加权
题目: Monkey and Banana Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Ot ...
- 生成图片验证码(.NET)
一.生成随机字符串 方法一: public string CreateRandomCode(int codeCount) { string allChar = "0,1,2,3,4,5,6, ...
- 部署docker-registry私有仓库
部署docker-registry私有仓库 创建文件夹 sudo mkdir -p /var/docker-data/{registry,certs,auth} sudo openssl req ...