• private + virtual in Java/C++


    在Java中,private方法是隐式final的,就是说即使在子类中定义一个一模一样的方法,编译器认为这是两个没有联系的方法。private方法不参与运行时多态,这点和

    final方法、static方法是一样的,而且,对显式final方法试图进行重写是会出错的,而对隐式final(private,static)方法可以在子类中定义一模一样的方法,只是不会

    参与运行时多态。也就是说,Java中除了声明为final、static、private的方法,其他都是默认的虚方法。

    而在C++中却是完全不同的处理思路,C++中可以为父类的private方法声明为virtual,也就是说可以在之子类中override,可以实现运行时多态。

    看下面这两段代码在C++和Java中的不同:

     1 //C++
     2 #include <iostream>
     3 using namespace std; 
     4 
     5 class Base { 
     6 public: 
     7     void f() { 
     8         g(); 
     9     }
    10 
    11 private: 
    12     virtual void g() { 
    13         cout << "Hi, MorningStar! I am g() of Base!." << endl; 
    14     } 
    15 };
    16 
    17 class Derived : public Base { 
    18 private: 
    19     virtual void g() { 
    20         cout << "Hi, MorningStar! I am g() of Derived." << endl; 
    21     } 
    22 };
    23 
    24 int main() { 
    25     Base *pB = new Derived(); 
    26     pB->f();         //print   Hi, MorningStar! I am g() of Derived.
    27     delete pB; 
    28     return 0; 
    29 }
     1 //java 
     2 class Base { 
     3     public void f() { 
     4         g(); 
     5     } 
     6 
     7     private void g() { 
     8         System.out.println("Hi, MorningStar! I am g() of Base."); 
     9     } 
    10 } 
    11 
    12 public class Derived extends Base { 
    13     private void g() { 
    14         System.out.println("Hi, MorningStar! I am g() of Derived."); 
    15     } 
    16     
    17     public static void main(String[] args) { 
    18         Base b = new Derived(); 
    19         b.f();  // print       Hi, MorningStar! I am g() of Base.
    20     } 
    21 }

    其实大可不必惊讶,不同语言的设计者的想法不同,当然会在这种语言的细节上有一些差异。。只需要深刻理解面向对象的设计思想即可。

    参考: C++、Java和C#语言在处理“虚拟私有方法”的差异

    另:下午研究了一波Java8 中接口的默认方法,觉得和C++中的多继承有点像。注意接口的静态方法既不能被接口继承也不能被类继承。

    发现C++的多继承和虚继承还挺简单的。嘿嘿。

    参考:Java8 默认方法

     

  • 相关阅读:
    Java中通过TCP协议发送和接收数据-Socket编程
    Java中通过UDP协议发送和接受数据
    多线程——线程范围内变量的共享
    多线程——线程间的同步通信
    多线程——线程同步互斥(synchronized)
    多线程——线程的生命周期
    多线程——线程的创建以及操作线程的相关方法简介
    iOS集成ShareSDK微博分享遇到问题 新浪微博登录redirect_uri_mismatch
    iOS中改变部分字体颜色
    CSS属性
  • 原文地址:https://www.cnblogs.com/niuxichuan/p/5998784.html
Copyright © 2020-2023  润新知