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. Android动画Animation简单示例

    Animation是Android给我们提供的一个可以实现动画效果的API,利用Animation我们可以实现一系列的动画效果,比如缩放动画,透明度动画,旋转动画,位移动画,布局动画,帧动画等等.An ...

  2. Swift5 语言参考(三) 类型

    在Swift中,有两种类型:命名类型和复合类型.一个名为类型是当它的定义可以给出一个特定名称的类型.命名类型包括类,结构,枚举和协议.例如,名为的用户定义类的实例MyClass具有该类型MyClass ...

  3. drf-序列化器的理解

    序列化器作用:  1.进行数据的校验 2.对数据对象进行转换 序列化:  模型类对象  ----->  python字典    用于输出, 返回给前端使用 反序列化:  前端传送的数据  --- ...

  4. 【sping揭秘】8、容器内部事件发布(一)

    容器内部事件发布 Spring的applicationContext容器提供的容器内事件发布功能,是通过java提供的自定义事件实现的 事件类型:eventObject 类继承 事件监听:eventL ...

  5. WebForm - cookie赋值乱码问题

    cookie的值为中文时候,取cookie的值会出现乱码 解决办法:存取cookie时候先解码和编码 存cookie,进行编码: cookie.Value = HttpUtility.UrlEncod ...

  6. JavaScript -- Window-框架

    -----025-Window-框架.html----- <!DOCTYPE html> <html> <head> <meta http-equiv=&qu ...

  7. 线上问题定位--OOM

    服务器上部署了Java服务,出现了OutOfMemoryError,问题应该如何定位? 解决思路 Java服务OOM,最常见的原因为: 有可能是内存分配确实过小,而正常业务使用了大量内存 某一个对象被 ...

  8. Spring Actuator源码分析(转)

    转自:http://blog.csdn.net/wsscy2004/article/details/50166333 Actuator Endpoint Actuator模块通过Endpoint暴露一 ...

  9. PTA (Advanced Level) 1009 Product of Polynomials

    1009 Product of Polynomials This time, you are supposed to find A×B where A and B are two polynomial ...

  10. [USACO 07DEC]Best Cow Line, Gold

    Description 题库链接 给以长度为 \(n\) 的字符串,要求每次只能从两边取一个字符,使得取出来之后字典序最小. \(1\leq n\leq 30000\) Solution 将字符串翻转 ...