博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
private + virtual in Java/C++
阅读量:5031 次
发布时间:2019-06-12

本文共 1633 字,大约阅读时间需要 5 分钟。

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

 

 

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

参考:。

 

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

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

参考:。

转载于:https://www.cnblogs.com/niuxichuan/p/5998784.html

你可能感兴趣的文章
Sizeof与Strlen的区别与联系
查看>>
hadoop2.2.0_hbase0.96_zookeeper3.4.5全分布式安装文档下载
查看>>
Flutter 贝塞尔曲线切割
查看>>
golang 的编译安装以及supervisord部署
查看>>
阿里架构师,讲述基于微服务的软件架构模式
查看>>
Eclipse导入maven项目时,Pom.xml文件报错处理方法
查看>>
01、JAVA开发准备
查看>>
Jenkins+Maven+SVN快速搭建持续集成环境(转)
查看>>
txmpp
查看>>
【Github教程】史上最全github使用方法:github入门到精通
查看>>
抽象工厂模式(Abstract Factory)
查看>>
luogu1373 小a和uim之大逃离 (dp)
查看>>
Redis的Pub/Sub客户端实现
查看>>
springMVC入门(一)------springMVC基本概念与安装
查看>>
Sam做题记录
查看>>
[bzoj] 2453 维护数列 || 单点修改分块
查看>>
IIS版本变迁
查看>>
mybatis09--自连接一对多查询
查看>>
myeclipse10添加jQuery自动提示的方法
查看>>
【eclipse jar包】在编写java代码时,为方便编程,常常会引用别人已经实现的方法,通常会封装成jar包,我们在编写时,只需引入到Eclipse中即可。...
查看>>