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 //java2 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