• 派生类与基类的成员屏蔽


    1. Java 中允许派生类中引入基类的重载方法

    例如:

     1 package JavaProject;
     2 class A{
     3     public void display(){System.out.println("null");}
     4     public void display(int i){System.out.println(""+i);}
     5 }
     6 public class B extends A{
     7     public void display(char a){System.out.println(a);}
     8     public static void main(String[]args)
     9     {
    10         B b=new B();
    11         b.display('a');
    12         b.display();
    13         b.display(10);
    14         
    15         A a=b;
    16         a.display('a');//out:97,调用的是display(int)
    17         a.display();//ok
    18         a.display(10);//ok
    19     }
    20 }

    如果要覆盖基类中的方法,可以用@Override 注解,这样可以避免不小心重载

    2.C++中不允许派生类中引入基类的重载方法,与基类方法名相同时会屏蔽掉基类中所有的该方法的重载

     1 #include<iostream>
     2 using namespace std;
     3 class A {
     4 public:
     5     void display() { cout << "null" << endl; }
     6     void display(int i) { cout << i << endl; }
     7 };
     8 class B :public A{
     9 public:
    10     void display(char i) { cout << i << endl; }
    11 };
    12 int main()
    13 {
    14     B b = B();
    15     b.display('a');
    16     //b.display();//error C++中要完成在派生类中覆盖基类的方法,就会屏蔽掉基类中重载的所有方法
    17     
    18     A a = b;
    19     a.display();//null
    20     a.display(10);//out:10
    21     a.display('a');//out:97 调用的是dispaly(int)。
    22     return 0;
    23 }

     3.Java与C++中的继承关系中多态的体现

    Java中:

     1 package JavaProject;
     2 class A{
     3     public void display(int i){System.out.println(i);}
     4 }
     5 public class B extends A{
     6     public void display(int a){System.out.println(a+10);}
     7     public static void main(String[]args)
     8     {
     9         A a=new B();
    10         a.display(10);//20
    11     }
    12 }

    Java 中没有相对C++而言没有虚函数和指针,所以当派生类中方法名、参数列表与基类中的一样时,发生的是覆盖,而没有隐藏的用法

    C++中:

     1 #include<iostream>
     2 using namespace std;
     3 class A {
     4 public:
     5     virtual void display(int i) { cout << i << endl; }
     6 };
     7 class B :public A{
     8 public:
     9     virtual void display(int i) { cout << i + 10<< endl; }
    10 };
    11 int main()
    12 {
    13     A * a = new B();
    14     a->display(10);
    15     /*
    16         A a=B();
    17         a.display();//10 隐藏用法
    18         */
    19 
    20     return 0;
    21 }

      C++中发生覆盖必须满足三个条件:(1)使用虚函数 (2)方法名相同 (3)参数列表相同

  • 相关阅读:
    Linux学习笔记 -- stdin/stdout 重定向
    Linux学习笔记
    使用 maven 构建 SpringMVC
    Linux学习笔记
    (转)Tomcat 启动后 “闪退”
    解决: Project facet Java version 1.8 is not supported
    由 MySQL server 和 mysql-connector 版本的不匹配引发的一场惊魂
    Adobe Acrobat 不能打开在线pdf。Adobe Acrobat 应用程序正在被终止,因为内存错误
    收缩数据库日志文件
    android基站定位程序获取地理位置
  • 原文地址:https://www.cnblogs.com/MyBlog-Richard/p/5512238.html
Copyright © 2020-2023  润新知