首页 > 代码库 > private + virtual in Java/C++

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 默认方法。

 

private + virtual in Java/C++