一. Java的子类父类间,同名函数重写、重载
A.java
package testpkg;
public class A {
public void func(int a){
System.out.println("A:func(int )");
}
public void func(){
System.out.println("A:func()");
}
}
B.java
package testpkg;
public class B extends A{
public void func(double b){
System.out.println("B:func(double )");
}
public void func(){
System.out.println("B:func()");
}
}
JavaTest.java
package testpkg;
public class JavaTest {
public static void main(String []args){
A a = new A();
B b = new B();
a.func(1);
a.func();
b.func(1); //函数未能成功重载,1为int,向上继承了A的func(int )
b.func(1.0); //函数重载
b.func(); //函数重写
}
}
测试输出:
发现子类父类同名字的成员函数
1) 在不同参数的情况下可以实现重载,如a.func(1) 和 b.func(1.0)
由于传入的参数为不同的int 和 double所以可以重载
2)子类如果有和父类同样的参数,就对该函数进行重写
a.func() 和 b.func() 就是a中的成员函数func在b中重写,被覆盖了
二. 下面是C++中的同类问题:
testCpp.cpp
#include <iostream>
using namespace std;
class A{
public:
void func(int a){
cout << "A:func(int )" << endl;
}
void func(){
cout << "A:func()" << endl;
}
};
class B : public A{
public:
void func(double b){
cout << "B:func(double )" << endl;
}
void func(){
cout << "B:func()" << endl;
}
};
int main(){
A a;
B b;
a.func(1);
a.func();
b.func(int(1));
b.func(1.0);
b.func();
return 0;
}
测试输出:
发现在重载方面,C++不同于Java子类和父类有格子的内存区域
所以A::func(int ) 和 B::func(double) 不能实现重载,子类继承父类后,不能重载父类的同名函数
但是重写还是可以的
综上:
Java在子类继承父类时,同时把父类的成员函数拷贝了进来
C++则是子类父类分开,各自占据一块内存空间,所以父类的同名函数在子类中无法实现重载,而只能被覆盖。