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

时间: 2024-11-08 15:34:32

private + virtual in Java/C++的相关文章

java.lang.NullPointerException: Attempt to invoke virtual method &#39;java.util.List com.yunweather.app.db.YunWeatherDB.loadProvinces()&#39; on a null object reference

NullPointerException:查看自己的什么地方是否对空指针进行了操作 Attempt to invoke virtual method 'java.util.List com.yunweather.app.db.YunWeatherDB.loadProvinces()' on a null object reference 尝试用一个空对象引用调用LoadProvinces()方法,查看调用LoadProvinces()的对象是否初始化,很可能是因为你没有初始化就调用了LoadPr

private virtual函数

派生类可以继承基类中的private virtual函数 <Effective c++>上说:"derived class可重新定义继承而来的private virtual函数".这个规则可以用到NVI手法中."令客户通过public non-virtual成员函数间接调用private virtual函数,称为non-virtualinterface(NVI)手法.它是所谓Template Method设计模式的一个独特表现形式.我把这个non-virtual函

private virtual in c++

source from http://blog.csdn.net/steedhorse/article/details/333664 // Test.cpp #include <iostream> using namespace std; class Base { public: void f() { g(); } private: virtual void g() { cout << "Hi, MorningStar! I am g() of Base!."

Java/C++之 public、protected、private ; virtual &amp; abstract

一.绪 Java/C++都是面向对象的第三代计算机高级编程语言,其本质雷同,而语法确有差异,稍不注意容易引起混淆.本文总结了一些这两门语言的差异之处,仅供参考. 二.C++ 对于C++这门语言,就其类来说成员访问类型就有  public.protected.private; 而就其继承方式来说 也分为共有继承.保护继承.私有继承.此外C++中有虚函数.纯虚函数之分,还有覆盖.隐藏之别.相对比较复杂. 就其多态性而言:当基类指针指向派生类时,此时基类指针只能访问基类中已有的成员,而不能访问派生类中

虚拟代理模式-Virtual Proxy(Java实现)

虚拟代理模式-Virtual Proxy 虚拟代理模式(Virtual PRoxy)会推迟真正所需对象实例化时间. 在需要真正的对象工作之前, 如果代理对象能够处理, 那么暂时不需要真正对象来出手. 优点: 这种方法的优点是,在应用程序启动时,由于不需要创建和装载所有的对象,因此加速了应用程序的启动. 缺点: 因为不能保证特定的应用程序对象被创建,在访问这个对象的任何地方,都需要检测确认它不是空(null).性能的降低上不仅仅是多了一句代码这么简单, ` if ` 这种跳转类语句的很有可能会阻塞

C++虚函数virtual,纯虚函数pure virtual和Java抽象函数abstract,接口interface与抽象类abstract class的比较

由于C++和Java都是面向对象的编程语言,它们的多态性就分别靠虚函数和抽象函数来实现. C++的虚函数可以在子类中重写,调用是根据实际的对象来判别的,而不是通过指针类型(普通函数的调用是根据当前指针类型来判断的).纯虚函数是一种在父函数中只定义而不实现的一种函数,不能用来声明对象,也可以被称为抽象类.纯虚函数的实现也可以在类声明外进行定义.C++中的抽象类abstract class是指至少有一个纯虚函数的类,如果一个类全部由纯虚函数组成,不包括任何的实现,被称为纯虚类. Java中的普通函数

Java中的private、protected、public和default的区别

(1)对于public修饰符,它具有最大的访问权限,可以访问任何一个在CLASSPATH下的类.接口.异常等.它往往用于对外的情况,也就是对象或类对外的一种接口的形式. (2)对于protected修饰符,它主要的作用就是用来保护子类的.它的含义在于子类可以用它修饰的成员,其他的不可以,它相当于传递给子类的一种继承的东西. (3)对于default来说,有点的时候也成为friendly(友员),它是针对本包访问而设计的,任何处于本包下的类.接口.异常等,都可以相互访问,即使是父类没有用prote

c++中的private/protect/public &amp; virtual

private: 私有控制符.这类成员只能被本类中的成员函数和类的友元函数访问. protected: 受保护控制符.这类成员可以被本类中的成员函数和类的友元函数访问,也可以被派生类的成员函数和类的友元函数访问. public: 共有控制符.这类成员可以被本类中的成员函数和类的友元函数访问,也可以被类作用域内的其他函数引用. virtual: C++通过虚函数实现多态."无论发送消息的对象属于什么类,它们均发送具有同一形式的消息,对消息的处理方式可能随接手消息的对象而变"的处理方式被称

Java中的public、protected、default和private的区别

(1)       对于public修饰符,它具有最大的访问权限,可以访问任何一个在CLASSPATH下的类.接口.异常等.它往往用于对外的情况,也就是对象或类对外的一种接口的形式. (2)       对于protected修饰符,它主要的作用就是用来保护子类的.它的含义在于子类可以用它修饰的成员,其他的不可以,它相当于传递给子类的一种继承的东西. (3)       对于default来说,有点的时候也成为friendly(友员),它是针对本包访问而设计的,任何处于本包下的类.接口.异常等,