C++中子类复写父类virtual方法要做到函数参数和返回值类型都一致,而Java中返回值类型可以不同,即子类复写的方法返回值类型可以使父类方法返回值类型的一个子类型。比如

返回类型兼容情况

Java 中不同返回值类型复写

public class Demo {
public static void main(String[] args) {
X x = new Y();
System.out.println(x.getValue());
}
}
public class X {
public Number getValue() {return new Integer(0);}
} class Y extends X {
public Double getValue() {return new Double(1.0);}
}

上述代码能够成功编译比执行输出1.0。不过对于基本数值类型还是不行的,如下代码无法通过编译:

class X {
public int getValue() {return 0;}
} class Y extends X {
public long getValue() {return 1;}
}

C++中要求严格一致

class Object {
};
class SpecialObject : public Object {
}; class A {
public:
virtual Object getValue() {
return Object();
}
}; class B: public A {
public:
virtual SpecialObject getValue() {
return SpecialObject();
}
}; int main() {
A* x = new B();
return 0;
}

报如下错误:

virtual.cpp:21:24: error: virtual function 'getValue' has a different return type ('SpecialObject') than the function it overrides

(which has return type 'Object')

virtual SpecialObject getValue() {

~~~~~~~~~~~~~ ^

virtual.cpp:13:17: note: overridden virtual function is here

virtual Object getValue() {

~~~~~~ ^

1 error generated.

可见性

Java

Java中要求子类复写父类方法时,其可见性不能低于父类。如下代码将报错

class X {
public int getValue() { return 0;}
} class Y extends X {
private int getValue() { return 1;}
}

C++

对复写方法可见性不要求,如下代码可以顺利编译并运行,输出为1.

class A {
public:
virtual int getValue() {
return 0;
}
}; class B: public A {
private:
virtual int getValue() {
return 1;
}
}; int main() {
A* x = new B();
cout<<x->getValue()<<endl;
return 0;
}

异常处理

Java

Java可以在方法参数后用throws指出可能会抛出的异常,来回避try-catch块。当子类中复写这样的方法时,子类中的方法声明抛出的异常范围不能超过父类中所定义的。

如下是可以的,虽然throws声明不是完全一致,子类声明抛出的异常类型是父类声明抛出异常类型中的子类。

class X {
public void call() throws Exception {}
} class Y extends X {
public void call() throws IOException, ClassCastException {}
}

但是下面的就不行

class X {
public void call() throws IOException {}
} class Y extends X {
public void call() throws Exception {}
}

C++

C++中没有类似throws声明

Java 与C++区别:复写(override)的更多相关文章

  1. C++和java多态的区别

    C++和java多态的区别 分类: Java2015-06-04 21:38 2人阅读 评论(0) 收藏 举报  转载自:http://www.cnblogs.com/plmnko/archive ...

  2. 第一章.java&golang的区别之:闭包

    对于golang一直存有觊觎之心,但一直苦于没有下定决心去学习研究,最近开始接触golang.就我个人来说,学习golang的原动力是因为想要站在java语言之外来审视java和其它语言的区别,再就是 ...

  3. C++与Java的语法区别

    C++与Java的语法区别 首先,两个大的不同是主函数和怎样编译的不同,接下来是许多小的区别. main 函数C++//自由浮动的函数int main( int argc, char* argv[]) ...

  4. Effective Java 36 Consistently use the Override annotation

    Principle Use the Override annotation on every method declaration that you believe to override a sup ...

  5. java的版本区别、下载、配置

    参考:http://blog.csdn.net/liujun13579/article/details/7684604 java的版本区别 常用的 java 程序分为  Java SE.Java EE ...

  6. java的this static public protected private abstract interface 在python的对应,java python一些区别

    1.因为工作的原因,最近使用了三个多月的java作为主力语言.很早之前在菜鸟教程也看过java文档两遍,但实践少,处于能看懂写出来不流畅的状态(对于java必须要略懂,不能能看到就头疼跳过,因为现在百 ...

  7. 7 -- Spring的基本用法 -- 8... 抽象Bean与子Bean;Bean继承与Java继承的区别;容器中的工厂Bean;获得Bean本身的id;强制初始化Bean

    7.8 深入理解容器中的Bean 7.8.1 抽象Bean与子Bean 把多个<bean.../>配置中相同的信息提取出来,集中成配置模版------这个配置模版并不是真正的Bean,因此 ...

  8. Android Library和Android APP、Java Library的区别

    Android Library和Android APP.Java Library的区别 Android Library在目录结构上与Android App相同,它能包含构建APP所需的一切(如源代码. ...

  9. JS与JAVA数据类型的区别

    JavaScript与Java数据类型的区别   阅读目录 Number String Boolean Null Undefined Object 今天开始正式认真学习js,虽然在平常j2ee开发中也 ...

随机推荐

  1. 实现域名访问网站—nginx反向代理

    今天在跟项目的时候,是否被耍了三个多小时,最后在我准备号材料准备他人求助的时候,在收集材料的时候,居然访问通了, 别问我为什么,我也不知道 ,哈哈哈哈(苦逼脸...) 分享出来,大家共同学习: 这个是 ...

  2. cad2020卸载/安装失败/如何彻底卸载清除干净cad2020注册表和文件的方法

    cad2020提示安装未完成,某些产品无法安装该怎样解决呢?一些朋友在win7或者win10系统下安装cad2020失败提示cad2020安装未完成,某些产品无法安装,也有时候想重新安装cad2020 ...

  3. Swift 里 Set(四)Testing for Membership

    即contains操作 /// - Parameter member: An element to look for in the set. /// - Returns: `true` if `mem ...

  4. D15——C语言基础学PYTHON

    C语言基础学习PYTHON——基础学习D15 20180926内容纲要: 1.CSS介绍 2.CSS的四种引入方式 3.CSS选择器 4.CSS常用属性 5.小结 6.练习 1 CSS介绍 层叠样式表 ...

  5. python再探

    python是一门强大的高级编程语言,之前的文章中介绍了python的基础知识,接下来会介绍一些python更为高级的知识. 面向对象编程 基本知识 一般编程思想分为面向过程和面向对象,前者的基本单元 ...

  6. tensorflow进阶篇-5(反向传播2)

    上面是一个简单的回归算法,下面是一个简单的二分值分类算法.从两个正态分布(N(-1,1)和N(3,1))生成100个数.所有从正态分布N(-1,1)生成的数据目标0:从正态分布N(3,1)生成的数据标 ...

  7. tensorflow进阶篇-4(损失函数2)

    Hinge损失函数主要用来评估支持向量机算法,但有时也用来评估神经网络算法.下面的示例中是计算两个目标类(-1,1)之间的损失.下面的代码中,使用目标值1,所以预测值离1越近,损失函数值越小: # U ...

  8. .net core跨平台发布至centos7

    在要发布的项目目录下输入发布命令 dotnet publish -r centos.-x64 发布成功后,文件位于xxx\bin\Debug\netcoreapp2.0\centos.7-x64\pu ...

  9. linux使用find和crontab命令定期清理过期文件

    crontab 命令 crontab 命令是 Linux 中用来设定重复执行命令或脚本的工具.它能够在指定的时间段内,按照需求以某一时间间隔执行命令或脚本. crontab 的基本用法 crontab ...

  10. 公共技术点( View 事件传递)

    转载地址:http://p.codekk.com/blogs/detail/54cfab086c4761e5001b253e 本文为 Android 开源项目源码解析 公共技术点中的 View 事件传 ...