C++和Java继承关系中方法覆盖的不同

下面是一段java代码:

package chapter5.game;

class Subject{
	int num;
	public void print(){
		System.out.println("Subject");
	}
}

class ChildClass extends Subject
{
	public void print(int i){
		System.out.println("ChildClass");
	}
}

public class SimpleDotComTestDrive {
	public static void main(String[] args) {
		ChildClass cc=new ChildClass();
		cc.print();
	}
}

程序的运行结果是:Subject

分析:在子类作用域查找不到完全合适的函数,然后在父类作用域中查找。

下面是一段C++代码:

#include<iostream>
using namespace std;

class Subject{
private:
	int num;
public:
	void print(){
		cout<<"Subject"<<endl;
	}
};

class ChildClass :public Subject
{
public:
	void print(int i){
		cout<<"ChildClass"<<endl;
	}
};

int main()
{
		ChildClass cc;
		cc.print();
}

程序的输出结果是:错误 1
error C2660: “ChildClass::print”: 函数不接受 0 个参数

分析:子类作用域查找到print函数便停止向上查找,然后检查参数不一致,提示错误,这是java和c++的不同。

时间: 2024-08-27 04:05:51

C++和Java继承关系中方法覆盖的不同的相关文章

JAVA继承关系中构造方法的调用次序详解

/*定义父类Base1*/ public class Base1 { int a;// 定义一个变量 /* 父类构造方法 */ public Base1(int a) { this.a = a; System.out.println("调用了父类的有参构造方法!"); } public Base1() { a = 1; System.out.println("调用了父类的无参构造方法!!"); ; } public static void main(String[]

【深入理解JVM】:Java类继承关系中的初始化顺序

Java类初始化的顺序经常让人犯迷糊,现在本文尝试着从JVM的角度,对Java非继承和继承关系中类的初始化顺序进行试验,尝试给出JVM角度的解释. 非继承关系中的初始化顺序 对于非继承关系,主类InitialOrderWithoutExtend中包含了静态成员变量(类变量)SampleClass 类的一个实例,普通成员变量SampleClass 类的2个实例(在程序中的顺序不一样)以及一个静态代码块,其中静态代码块中如果静态成员变量sam不为空,则改变sam的引用.main()方法中创建了2个主

Java类继承关系中的初始化顺序

Java类初始化的顺序经常让人犯迷糊,现在本文尝试着从JVM的角度,对Java非继承和继承关系中类的初始化顺序进行试验,尝试给出JVM角度的解释. 非继承关系中的初始化顺序 对于非继承关系,主类InitialOrderWithoutExtend中包含了静态成员变量(类变量)SampleClass 类的一个实例,普通成员变量SampleClass 类的2个实例(在程序中的顺序不一样)以及一个静态代码块,其中静态代码块中如果静态成员变量sam不为空,则改变sam的引用.main()方法中创建了2个主

Java:继承关系中的构造函数(转)

1.构造函数不会被继承到子类. 2.子类的构造函数中的第一行(除注释外)必须是父类对象(super)的构造函数. 如果没有显示指定,则有两种情况: 1)如果父类有默认构造器(不带参数的构造器才是默认构造器),则会隐式地调用它(super()),此时不会出错: 2)如果父类没有默认构造器,则会出错. class Game { Game() { System.out.println("Game default constructor"); } Game(int i) { System.ou

继承关系中的第三种方式:利用&lt;union-subclass&gt;(补充)

继承关系中的第三种方式:利用<union-subclass>   代码:   映射文件(其他的代码和其他继承关系相同)   Person.hbm.xml   <?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/

关于Java继承体系中this的表示关系

Java的继承体系中,因为有重写的概念,所以说this在子父类之间的调用到底是谁的方法,或者成员属性,的问题是一个值得思考的问题; 先说结论:如果在测试类中调用的是子父类同名的成员属性,这个this.成员  属性的值就是父类中这个成员属性的值,因为在Java中没有重写成员属性这一概念 ,如果调用的是同名的成员方法的话,那就应该调用的是重写后的成员方法.....如果子类中没有这个成员方法,则向父类中寻找. 上代码支持论证: package Test_This; public class Demo

hibernate继承关系映射方法(三)--每个具体类一张表TPC

TPC:所谓是"每个具体类一张表(table per concrete class)"的意思是:使继承体系中每一个子类都对应数据库中的一张表.每一个子类对应的数据库表都包含了父类的信息,并且包含了自己独有的属性.每个子类对应一张表,而且这个表的信息是完备的,即包含了所有从父类继承下来的属性映射的字段.这种策略是使用<union-subclass>标签来定义子类的. 注意:三个类+一个父类映射文件+两张表 student表 worker表 测试工程: Person.java

19-从零玩转JavaWeb-继承关系与方法覆盖

配套视频详解 继承子类与父类的关系 继承子类与父类的关系代码演示 继承方法的覆盖 方法覆盖原则 一.继承编写过程   二.子类可以继承父类当中哪些内容 可以自行把修饰符换下, 然后查看子类能不能访问 详细演示在视频当中    三.方法覆盖   四.方法覆盖原则 五.判断方法是否是覆盖   六.什么时候使用覆盖 七.方法重载与方法覆盖的区别   代码-软件在群文件共享当中

Java继承类中static成员函数的重写

在java中,static成员函数是否可以被重写呢? 结论是,你可以在子类中重写一个static函数,但是这个函数并不能像正常的非static函数那样运行. 也就是说,虽然你可以定义一个重写函数,但是该函数没有多态特性.让我们测试一下: 1 class testClass1{ 2 static void SMothod(){ 3 System.out.println("static in testClass1"); 4 } 5 } 6 class testClass2 extends