对比C++与Java中的函数重载、覆盖、和隐藏

                                                     在C++中

1.函数的重载

  C++中的函数的重载要求的是  函数名相同 参数列表必须不同  返回值类型可以相同也可以不相同;只有参数列表不相同,在函数调用时,编译环境才能准确抉择调用的是哪个函数。例如:void display();void display(int  i);void dispaly(double  i);void  display(int i,double i);

void display(double  i,int  i);这几个函数相互构成重载;如果只有返回值类型不同,则是不正确的重载例如:int display();与void display();是不正确的重载;

  另外,C++的函数的重载只能发生在同一级的类中;基类和派生类之间同名函数不能构成重载

2.函数的隐藏

  C++中的函数的隐藏是指基类和派生类之间的同名函数之间,由派生类的函数隐藏掉基类的函数;如果基类的函数与派生类的函数名相同,二参数列表不相同,则基类的函数同样被隐藏,若要调用则必须指明作用域::

 1 #include<iostream>
 2 using namespace std;
 3 class person
 4 {
 5   public :
 6       void display(int i){cout<<"基类被调用"<<endl;}
 7       //int display(int i){return 0;}
 8 };
 9 class student:public person
10 {
11    public :void display(){cout<<"派生类被调用"<<endl;}
12 };
13 int main()
14 {
15     student *stu=new student();
16     //stu->display(0);//错误:C++中函数的重载只能在同一个类中同时也不能发生覆盖
17     //stu->person::display(0);//可以这样写
18     stu->display();//输出 派生类被调用

    /* person *per=new student();
      per->display();//输出基类被调用//这是与覆盖的区别所在       */
19  return 0;
20 }

3.函数的覆盖

  C++中函数覆盖的条件是:

  (1)基类的函数必须是虚函数

  (2)发生覆盖的两个函数要位于派生类和基类中

  (3)函数名与参数列表必须完全相同

#include<iostream>
using namespace std;
class person
{
public :
    virtual void display(){cout<<"基类函数被调用"<<endl;};
};
class student:public person
{
public :
    void display(){cout<<"派生类函数被调用"<<endl;}
};

int main()
{
    person *per=new person();
    per->display();//输出基类被调用
    delete per;
    per=new student();
    per->display();//输出派生类函数被调用//这一点是覆盖与隐藏的区别

    return 0;
}

                                在Java中

1  函数的重载

   在Java中函数的重载 可以发生在基类和派生类之间 同样要求函数名相同函数,参数列表不同,返回值类型可以相同可以不相同

 1 class BaseClass
 2 {
 3     public static void display(int i){System.out.println("Baseclass");}
 4 }
 5 public class ThisClass extends BaseClass
 6 {
 7     public static void display(){System.out.println("ThisClass");}
 8     public static void main(String[]args)
 9     {
10         display();//调用派生类的函数
11         display(0);//调用基类的函数      ////////////////////////////////////////////////////////////      此处并没有发生覆盖和隐藏  与C++不同
12     }
13 }

    此例中基类BaseClass 中的void display(int i);与派生类ThisClass中的void display();构成了重载

2.函数的覆盖

  Java中函数的覆盖要求基类与派生类的 函数名、参数列表完全相同。示例如下:

 1 public class PrivateOverride
 2 {
 3     public  void f(){System.out.println("private f()");}
 4     //private void f(){System.out.println("private f()");}
 5     public static void main(String[]args)
 6     {
 7         PrivateOverride po=new Derived();
 8         po.f();//输出public f()//表明派生类函数覆盖了基类的函数
 9     }
10
11 }
12 class Derived extends PrivateOverride
13 {
14         public void f(){System.out.print("public f()");}
15 }

3.上例中 如果把基类中 f()的访问属性置为private,则输出 private f()   得出的结论是只有非private方法才可以被覆盖

时间: 2024-10-07 07:36:35

对比C++与Java中的函数重载、覆盖、和隐藏的相关文章

Java中的Overload(重载)与Override(重写、覆盖)

java中的方法重载发生在同一个类中两个或者多个方法的方法名相同但是参数不同的情况,方法重载是指子类与父类之间子类重新定义了父类的方法,重写的方法与原方法签名.返回值.参数完全相同.Overload(重载) 重载Overload是一个类中多态性的一种表现,是编译时的多态性.方法重载是让类以统一的方式处理不同类型数据的一种手段.重载发生在同一个类中.同名的方法如果有不同的参数列表(参数个数.类型)则视为重载. java方法的重载,就是可以在类中创建多个方法,这些方法具有相同的名字,但具有不同的参数

c++中的函数重载

c++中的函数重载 什么是函数重载 重载函数是函数的一种特殊情况,为方便使用,C++允许在同一范围中声明几个功能类似的同名函数,但是这些同名函数的形式参数(指参数的个数.类型或者顺序)必须不同,这组函数被称为重载函数. 函数重载的作用 重载函数常用来实现功能类似而所处理的数据类型不同的问题,能减少函数名的数量,提高程序的可读性. 重载函数的构成说明 定义一个类,添加一系列函数名相同的函数,但参数形式各有不同,测试一下能否构成重载. #include <iostream> using names

java中方法的重载与重写的区别

JAVA中方法的重载与重写 1)  方法的的参数上看:重载后的方法与源方法在参数的类型以参数列表的顺序上会发生改变,而重写后的方法在参数的数据类型与参数列表的顺序不会发生改变 2)原方法是否对被覆盖:重载后的方法不会覆盖原方法,而重写后的方法会覆盖父类中的方法,调用时也只会调用重写后的方法. 3)调用方法的对象上:重载后的方法被调用时,调用对象不同时,调用的方法不同,产生的结果也不同:而重写后的方法被调用时,无论调用的对象是父类或者子类的对象,调用的方法相同,产生的结果也一样

关于在C#中对函数重载理解

函数重载是个什么概念,才接触的这个概念的时候我也是完全昏了,还在自己看看了书后就理解了.那什么是函数重载呢?我个人理解的是在同一个作用域下有多个同名的函数,但是他们的形参的类型是不同的,或者参数个数是不同的.当我们调用这些函数时,怎么判断我们调用的是那一个函数呢,这个就要看你在使用重载函数时所传参数的类型或者参数个数.好了,话不说.看看代码就知道了. using System;namespace overload{    class a    {        public void print

java中的函数,数组

函数 程序中独立的过程 函数的语法: 函数的定义 声明 static 返回值类型 函数名 (参数表) 形式参数:形参 在函数内部有效的局部变量 实现 { 语句 } 函数的调用 函数名(参数); 实际参数:实参 为形参赋值 接收返回值 函数的作用: 1. 减少冗余代码,提高程序的可维护性 2. 可重用性 函数库 3. 加强代码的结构化 提高可读性 利于分工 非结构化编程(语句) ---> 结构化编程(函数) ---> 面向对象(类) 数组 一次性定义多个同类型的变量 数组空间在内存是连续的 定义

js中没有函数重载,怎样实现函数重载的功能?

js中没有函数重载,javasript中使用可选参数:arguments实现相同的功能.. 函数在定义的时候可不定义参数: <script type="text/javascript" > function say() { for (var i = 0; i < arguments.length; i++) { alert(arguments[i].toString()); } } </script> 调用:<input type="but

关于C++与Java中虚函数问题的读书笔记

之前一直用C++编程,对虚函数还是一些较为肤浅的理解.可近期由于某些原因搞了下Java,发现有些知识点不熟,于是站在先驱巨人的肩上谈谈C++与Java中虚函数问题. Java中的虚函数 以下是段别人的代码,输入结果竟是Base,这让一直以来用C/C++的我有些莫不着头脑,不是Java里对象是引用吗?C/C++中通过指向基类的指针或引用来指向派生类,那么对于虚函数来说通过基类指针使用的是指向的派生类.但在Java中没有keyword标明虚函数,此时就不是非常明确究竟调用的谁. class base

JAVA中字符串函数subString的用法小结

本篇文章主要是对JAVA中字符串函数subString的用法进行了详细的介绍,需要的朋友可以过来参考下,希望对大家有所帮助 String str; str=str.substring(int beginIndex);截取掉str从首字母起长度为beginIndex的字符串,将剩余字符串赋值给str: str=str.substring(int beginIndex,int endIndex);截取str中从beginIndex开始至endIndex结束时的字符串,并将其赋值给str; demo:

【java&amp;c++】父子类中同名函数的覆盖问题

java和c++两门语言对于父子类中同名函数具有不同的处理方式. 先上两段代码: C++: class Basic { public: void test(string i){ cout << "basic str" <<endl; } void test(int i){ cout << "basic" <<endl; } }; class Senior : public Basic { public: void te