Virtual是C++ OO机制中很重要的一个关键字。只要是学过C++的人都知道在类Base中加了Virtual关键字的函数就是虚拟函数(例如函数print),于是在Base的派生类Derived中就可以通过重写虚拟函数来实现对基类虚拟函数的覆盖。当基类Base的指针point指向派生类Derived的对象时,对point的print函数的调用实际上是调用了Derived的print函数而不是Base的print函数。这是面向对象中的多态性的体现。(关于虚拟机制是如何实现的,参见Inside the C++ Object Model ,Addison Wesley 1996)
class Base
{
public:Base(){}
public:
       virtual void print(){cout<<"Base";}
};
 
class Derived:public Base
{
public:Derived(){}
public:
       void print(){cout<<"Derived";}
};
 
int main()
{
       Base *point=new Derived();
       point->print();
}

Output:
Derived 
这也许会使人联想到函数的重载,但稍加对比就会发现两者是完全不同的:
(1)       重载的几个函数必须在同一个类中;
覆盖的函数必须在有继承关系的不同的类中
(2)       覆盖的几个函数必须函数名、参数、返回值都相同;
重载的函数必须函数名相同,参数不同。参数不同的目的就是为了在函数调用的时候编译器能够通过参数来判断程序是在调用的哪个函数。这也就很自然地解释了为什么函数不能通过返回值不同来重载,因为程序在调用函数时很有可能不关心返回值,编译器就无法从代码中看出程序在调用的是哪个函数了。
(3)       覆盖的函数前必须加关键字Virtual;
重载和Virtual没有任何瓜葛,加不加都不影响重载的运作。

最新文章

  1. 项目组织与管理SPM(理论基础)
  2. Io 异常: The Network Adapter could not establish the connection 解决方法
  3. Legolas工业自动化平台案例 —— 水源地自动化监控系统
  4. POJ 1039问题描述
  5. 7、JavaScript总结——实现选项卡切换的效果
  6. junit中的assert方法总结
  7. php集成开发环境IDE
  8. HDU 4675 GCD of Sequence(容斥)
  9. 百度地图SDK下载以及创建应用(申请Key)和本地导入Demo
  10. [jobdu]二叉树的镜像
  11. poj 2976 Dropping tests
  12. java下发电子邮件demo
  13. 计蒜客NOIP2017提高组模拟赛(五)day2-成绩统计
  14. python爬虫踩坑教程
  15. win openssl 生成证书
  16. day10 十 函数、形参和实参
  17. Linux基础命令---设置程序优先级nice
  18. List&lt;T&gt;随机返回一个
  19. 查看磁盘读写:iostat
  20. 如意云路由刷PandoraBox

热门文章

  1. TListView列表拒绝添加重复信息
  2. Cts框架解析(12)-ITargetPreparer
  3. 如何在Swift里用UnsafeMutablePointer
  4. VirtualBOX 虚拟机安装 OS X 10.9 Mavericks 及 Xcode 5,本人X220亲测
  5. 如何在linux下解压缩rar和zip格式的文件压缩包
  6. Windows环境下安装导入tornado
  7. python基础语法小笔记
  8. Java动态加载jar及class文件
  9. hdu 4607 树的直径
  10. [原创] CSS总结!! 有关HTML第二篇 !!