private + virtual in Java/C++

java

在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++ 的全部内容, 来源链接: utcz.com/z/394511.html

回到顶部