码迷,mamicode.com
首页 > 编程语言 > 详细

private + virtual in Java/C++

时间:2016-10-26 06:43:55      阅读:190      评论:0      收藏:0      [点我收藏+]

标签:思路   声明   面向对象   nal   space   extend   运行时   ++   blog   

在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++

标签:思路   声明   面向对象   nal   space   extend   运行时   ++   blog   

原文地址:http://www.cnblogs.com/niuxichuan/p/5998784.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!