之前一直用C++编程,对虚函数还是一些较为肤浅的理解。可近期由于某些原因搞了下Java,发现有些知识点不熟,于是站在先驱巨人的肩上谈谈C++与Java中虚函数问题。

Java中的虚函数

以下是段别人的代码,输入结果竟是Base,这让一直以来用C/C++的我有些莫不着头脑,不是Java里对象是引用吗?C/C++中通过指向基类的指针或引用来指向派生类,那么对于虚函数来说通过基类指针使用的是指向的派生类。但在Java中没有keyword标明虚函数,此时就不是非常明确究竟调用的谁。

class base
{
private void print()
{
System.out.println("base");
}
public void doprint()
{
print();
}
} class derive extends base
{
private void print()
{
System.out.println("derive");
}
} class testVirtual
{
public static void main(String args[])
{
base b = new derive();
b.doprint();
} }

而以下这段Java输出的是derived,注意函数以及訪问权限的变化。

class base
{
public void print()
{
System.out.println("base");
}
public void doprint()
{
print();
}
} class derive extends base
{
public void print()
{
System.out.println("derive");
}
} class testVirtual
{
public static void main(String args[])
{
base b = new derive();
b.print();
}
}

大牛甲如是说:“java里的protected,public,包訪问级别的函数都是虚函数。”也有大牛乙如是说:“java里的都是虚函数。”我的解读是这二位大牛的话肯定都对,private级别的函数也能够说是虚函数,仅仅只是基类的引用无法直接訪问派生类的private级别的函数罢了,仅仅能訪问自己的。

于是能够断定以下这段就是输出derive了。没错,就是这样。

class base {
private void print() {
System.out.println("base");
} public void doprint() {
print();
}
} class derive extends base {
private void print() {
System.out.println("derive");
}
public void doprint() {
print();
}
} class testVirtual {
public static void main(String args[]) {
base b = new derive();
b.doprint();
}
}

C++中的虚函数

以下这段C++代码输出的是drived,通过基类的指针或引用指向派生类或基类,然后调用二者共同拥有都有的作为虚函数的函数,此时调用的是指针所指向的类(能够是基类也能够是派生类,关键看此时基类的指针或引用指向的是派生类还是基类)。注意仅仅有基类的指针或引用才干实现虚函数有关多态的问题,其它类型在C++中仅仅调用自己的函数。

#include<iostream>
using namespace std; class base
{
private:
virtual void print()
{
printf("base\n");
}
public:
void doprint()
{
print();
}
virtual ~base(){}
}; class derived : public base
{
virtual void print()
{
printf("derived\n");
}
}; int main(int argc, char* argv[])
{
derived d;
base& b = d;
b.doprint();
return 0;
}
//也是derived
#include<iostream>
using namespace std; class base
{
private:
virtual void print()
{
printf("base\n");
}
public:
void doprint()
{
print();
}
virtual ~base(){}
}; class derived : public base
{
private:
virtual void print()
{
printf("derived\n");
}
public:
void doprint()
{
print();
}
}; int main(int argc, char* argv[])
{
derived d;
base& b = d;
b.doprint();
return 0;
}
//输出的是base
#include<iostream>
using namespace std; class base
{
private:
virtual void print()
{
printf("base\n");
}
public:
void doprint()
{
print();
}
virtual ~base(){}
}; class derived : public base
{
private:
virtual void print()
{
printf("derived\n");
}
public:
void doprint()
{
print();
}
}; int main(int argc, char* argv[])
{
derived d;
base b = d;
b.doprint();
return 0;
}

以下这段输出的就是base了,由于不是虚函数,通过基类的指针或引用调用的就是基类的函数。

#include<iostream>
using namespace std; class base
{
public:
void print()
{
printf("base\n");
}
virtual ~base(){}
}; class derived : public base
{
public:
void print()
{
printf("derived\n");
}
}; int main(int argc, char* argv[])
{
derived d;
base& b = d;
b.print();
return 0;
}

以下C++代码输出的是derived,这就是同名覆盖原则,派生类覆盖积累的同名函数。

#include<iostream>
using namespace std; class base
{
public:
void print()
{
printf("base\n");
}
virtual ~base(){}
}; class derived : public base
{
public:
void print()
{
printf("derived\n");
}
}; int main(int argc, char* argv[])
{
derived d;
base& b = d;
d.print();
return 0;
}

总结对照

C++                     Java

虚函数     --------    普通函数

纯虚函数   --------    抽象函数

抽象类     --------    抽象类

虚基类     --------    接口     

      关于虚函数的实现机制,涉及虚函数表等,兴许博客补上。因为理论知识不足,难以上升到详细底层实现,望理解!

关于C++与Java中虚函数问题的读书笔记的更多相关文章

  1. C++虚函数【Java有虚函数吗?】

    1,简单介绍 定义在基类中的函数,子类必须对其进行覆写![必须对其进行覆写?!]——Java中的接口.Abstract方法中的抽象类也有这样的要求. C++中定义: virtual void deal ...

  2. C++中虚函数的作用浅析

    虚函数联系到多态,多态联系到继承.所以本文中都是在继承层次上做文章.没了继承,什么都没得谈. 下面是对C++的虚函数这玩意儿的理解. 一, 什么是虚函数(如果不知道虚函数为何物,但有急切的想知道,那你 ...

  3. C++中虚函数的作用是什么?它应该怎么用呢?(转)

    虚函数联系到多态,多态联系到继承.所以本文中都是在继承层次上做文章.没了继承,什么都没得谈. 下面是对C++的虚函数这玩意儿的理解. 一, 什么是虚函数(如果不知道虚函数为何物,但有急切的想知道,那你 ...

  4. C++中虚函数功能的实现机制

    要理解C++中虚函数是如何工作的,需要回答四个问题. 1.  什么是虚函数. 虚函数由于必须是在类中声明的函数,因此又称为虚方法.所有以virtual修饰符开始的成员函数都成为虚方法.此时注意是vir ...

  5. JAVA中字符串函数subString的用法小结

    本篇文章主要是对JAVA中字符串函数subString的用法进行了详细的介绍,需要的朋友可以过来参考下,希望对大家有所帮助 String str; str=str.substring(int begi ...

  6. Java中的函数对象

    初次听说java中的函数对象可能,比较的陌生.可以类比着来理解一下,人们常说java中没有了指针,殊不知,java中的对象引用就是指针,有时候我们说一个对象往往指的就是这个对象的引用,也就是说基本上把 ...

  7. c++中虚函数

    虽然很难找到一本不讨论多态性的C++书籍或杂志,但是,大多数这类讨论使多态性和C++虚函数的使用看起来很难.我打算在这篇文章中通过从几个方面和结合一些例子使读者理解在C++中的虚函数实现技术.说明一点 ...

  8. C++中虚函数的作用和虚函数的工作原理

    1 C++中虚函数的作用和多态 虚函数: 实现类的多态性 关键字:虚函数:虚函数的作用:多态性:多态公有继承:动态联编 C++中的虚函数的作用主要是实现了多态的机制.基类定义虚函数,子类可以重写该函数 ...

  9. 《Java并发编程的艺术》读书笔记:二、Java并发机制的底层实现原理

    二.Java并发机制底层实现原理 这里是我的<Java并发编程的艺术>读书笔记的第二篇,对前文有兴趣的朋友可以去这里看第一篇:一.并发编程的目的与挑战 有兴趣讨论的朋友可以给我留言! 1. ...

随机推荐

  1. LeetCode:Sort List

    Title: Sort a linked list in O(n log n) time using constant space complexity. 思路:考虑快速排序和归并排序,但是我的快速排 ...

  2. 【jQuery】jQuery筛选器规则

    转载自:http://blog.csdn.net/lijinwei112/article/details/6938134 筛选器中加入变量 var ac = "select_" + ...

  3. 【RMQ问题】求数组区间最大值,NYOJ-1185-最大最小值

    转自:http://blog.csdn.net/lilongherolilong/article/details/6624390 先挖好坑,明天该去郑轻找虐 RMQ(Range Minimum/Max ...

  4. Android提升进入界面的速度

    应用除了有内存占用.内存泄露.内存抖动等看不见的性能问题外,还有很多看得见的性能问题,比如进入界面慢.点击反应慢.页面卡顿等等,这些看得见的体验问题会严重影响用户使用APP心情,但用户的情绪又无法通过 ...

  5. 常用UI布局

    1.LinearLayout(线性布局):将布局所包含的控件在线性方向上依次排列. <1>android:orientation 指定了排列方向(垂直方向(vertical).水平方向(h ...

  6. 11g 重建EM 报ORA-20001: SYSMAN already exists

    今天在安装11g(11.1.0.7.0)数据库之后,通过emca -config dbcontrol db -repos create 命令手工创建em的时候报错,查看日志后发现有以下错误 CONFI ...

  7. Flash Player”又来了“!

    2012年,Adobe宣布缩小对Linux平台的支持,自Flash Player 11.2版本之后,只为Linux平台上的Flash Player提供安全更新和bug修复,而不再提供版本更新. 四年之 ...

  8. 在eclipse.ini中指定jdk的方式

    在eclisep的安装目录,打开eclipse.ini文件,加上这么一行,如下红色所示,注意加在-Vmargs前面,这两种方式的区别是:第二种方式除了会有eclipse进程外还会启动个java进程. ...

  9. 《Python CookBook2》 第一章 文本 - 测试一个对象是否是类字符串 && 字符串对齐

    测试一个对象是否是类字符串 任务 有时候需要测试一个对象,尤其是当你在写一个函数或者方法的时候,经常需要测试传入的参数是否是一个字符串. 解决方案 利用内建的isinstance 和basestrin ...

  10. VS中使用QT调用R脚本

    一开始想直接把R编译成库然后调用R,后来查了n多资料,发现VS中是无法办到的,官方也给出了一句话,大概意思就是没可能在VS中使用R提供的C++接口,大概是涉及到了底层的ABI的原因,具体也不太清楚. ...