C++和Java中类继承同名函数的区分
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不会屏蔽,在派生类对象中,只要使用不同的参数列表,依然可以区分出该同名函数来自基类还是派生类。
C++和Java中类继承同名函数的区分相关推荐
- java同名函数_浅谈Java 继承接口同名函数问题
在Java中如果一个类同时继承接口A与B,并且这两个接口中具有同名方法,会怎么样? 动手做实验: interface A{ void fun(); } interface B{ void fun(); ...
- 23.C++- 继承的多种方式、显示调用父类构造函数、父子之间的同名函数、virtual虚函数...
上章链接: 22.C++- 继承与组合,protected访问级别 继承方式 继承方式位于定义子类的":"后面,比如: class Line : public Object // ...
- java赋值兼容原则,多态问题抛出(赋值兼容性原则遇上父类与子类同名函数的时候)...
首先通过一个段代码来分析 #include class Parent//定义父类 { public: Parent(int a = 0) { this->a = a; } void print( ...
- 继承- 子类与父类有同名函数,变量
学习了类的继承,今天说一下当父类与子类中有同名函数和变量时那么程序将怎么执行.首先明确当基类和子类有同名函数或者变量时,子类依然从父类继承. 举例说明: 例程说明: 父类和子类有同名的成员 data: ...
- Java中类的继承详解(转载)
文章目录 前言 一.继承的特点 二.重写父类的方法 三.super 限定 四.调用父类构造器 前言 继承是面向对象的三大特征之一. 也是实现软件复用的重要手段. Java继承具有单继承的特点, 每 ...
- java中的类的继承_再谈Java中类的继承
上篇博客谈到了Java中类的继承,但是那些远远不能满足我们在实际操作中的需要,那么怎么才能让子类的功能更强大,并且具有父类的属性呢? 一: 父类 1 public classA {2 3 final ...
- c++继承父类的子类,如何调用父类的同名函数?
https://blog.csdn.net/qq_26399665/article/details/52080215 子类调用父类的同名函数: 子类和父类返回值参数相同,函数名相同,有virtual关 ...
- java 子类的同名方法_子类父类拥有同名的方法时……
子类父类拥有同名的方法时-- (这个程序是不能运行的) packageyanzheng; public classParentChildTest { public static voidmain(St ...
- Java 面向对象-继承
1.继承的概述 泛指把前人的作风.文化.知识.财产等接受过来 java中的继承 让类与类之间产生父子关系 被继承的类叫做父类(基类.超类) 继承的类叫做子类(派生类) 格式(extends) clas ...
最新文章
- PE文件和COFF文件格式分析——导出表
- 微信小程序记账应用实例课程(完结)——对接服务端账目CRUD
- php 支付宝手机端_PHP 手机支付宝接口
- LeetCode209 长度最小的子数组(二分法)
- 【转】Android Studio系列教程一--下载与安装
- oracle 与sql serve 获取随机行数的数据
- oracle Constraint(转)
- 【leetcode】472. Concatenated Words
- 语言的顺序表的合拼_2020语文中考专题五:语言运用和综合性学习。掌握基础题五种题型...
- MVC模式在游戏开发的应用
- Bailian2870 求矩阵的加法【矩阵】
- stm32 SWD printf SWD调试输出
- 3种内网穿透方式连接家用宽带服务器
- 原型工具——墨刀以及Axure的比较
- 到底什么是范数?什么是0范数、1范数、2范数?区别又是什么?
- 用Python爬取购物节当天热门商品销量数据,看看大家喜欢什么
- CSMA/CD 协议
- 计算机网络Wireshark实验(西安交通大学)
- SpringMVC核心知识的梳理(现在都用SpringBoot了,但是SpringMVC还的学的扎实点,饮水思源)
- 如何使用origin跨工作簿进行公式计算