C++和Java的派生类对于与基类同名的函数有着不同的处理方式。
在C++中,假设基类中有一个dis()函数,而派生类又定义了一个dis()函数,这时候在派生类对象中会将基类的dis()函数屏蔽掉,上代码:
class a
{
private:
int num;
float floatnum;
public:
void dis(void)
{
cout << "这是基类的dis方法()" << endl;
}
}
class b : public a
{
public:
void dis(void i)
{
cout << "这是派生类的dis方法" << endl;
}
};
此时使用main函数来进行b类的实例化
int main(void)
{
a classa;
b classb;
classb.dis();
}
这样的结果是调用了派生类的方法,很明显派生类中与基类同名的dis方法在派生类对象classb调用dis()方法的时候,尽管派生类已经继承了基类所有的公有方法,但派生类屏蔽了基类中与之同名的dis方法。
那么有没有可能是派生类只屏蔽基类中与之特征标完全相同的函数呢?很遗憾,并不是这样,以下代码:
#include<iostream>
using namespace std;
class a
{
private:
int num;
float floatnum;
public:
void dis(void)
{
cout << "这是基类的dis() 方法" << endl;
}
void dis(int i)
{
cout << "这是基类的dis(int i) 方法" << endl;
}
void dis(char c)
{
cout << "这是基类的dis(char c) 方法" << endl;
}
};
class b : public a
{
public:
void dis(void)
{
cout << "这是派生类的dis方法" << endl;
}
};
这段代码中我在基类中重载了多个dis()方法,而在派生类中定义了一个dis方法,现在来调用main函数:
int main(void)
{
a classa;
b classb;
classb.dis('c');
}
main函数中,我意图使用一个字符作为dis()的参数来使派生类对象调用基类中的dis(char c)版本,但还未运行,IDE本身就给出了错误提示:函数中的参数太多。
这个错误的意思就是,我使用的这个dis()函数它不接受参数,这从侧面证明了C++中对于派生类与基类同名的函数,派生类对象在使用这个同名函数的时候是将基类中所有的同名函数全部屏蔽掉(不管它们的返回类型,参数列表是否一致),在派生类对象中无法使用这些已经被公有继承过来的同名函数,如果非要使用基类中的同名函数,就得将函数声明为虚的,这又是一回事,这里不做深入探讨。
接下来来看Java,Java中对待基类与派生类的同名函数显然不同于C++,以下代码
class T {
public void dis(int i) {
System.out.println("这是基类的dis(int i)方法");
}
public void dis(char c) {
System.out.println("这是基类的dis(char c)方法");
}
}
public class Test extends T{
public void dis(int i) {
System.out.println("这是派生类的dis(int i)方法");
}
public static void main(String[] args) {
Test t = new Test();
t.dis('c');
}
}
注意下划线,这段代码在Java中完全正确,它直接调用了基类T中的public void dis(char c)这个同名函数的版本,也就是说,Java在继承类的时候,是不会自动屏蔽基类中与派生类同名的函数的,但这里又有一点特例,我在基类T中有一个public void dis(int i)的函数,而在派生类Test中也有一个特征标与之完全相同的函数,那么当我使用这样的代码: t.dis( 1 ), 会发生什么?
很显然,这样会调用派生类的public void dis(int i)版本,这在Java中是覆盖了基类的定义,也可以说是屏蔽。
总之,C++和Java在类继承中对待基类和派生类中的同名函数,其处理方法是不同的,C++是直接屏蔽掉基类中所有的与派生类同名的函数,而Java与此不同,Java不会屏蔽,在派生类对象中,只要使用不同的参数列表,依然可以区分出该同名函数来自基类还是派生类。