博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
关键字 virtual
阅读量:4521 次
发布时间:2019-06-08

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

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没有任何瓜葛,加不加都不影响重载的运作。

转载于:https://www.cnblogs.com/qiushuixiaozhanshi/p/5706118.html

你可能感兴趣的文章
配置Synergy(Server : XP, client: Win7)
查看>>
Hadoop集群(第7期)_Eclipse开发环境设置
查看>>
Mysql 多表查询详解
查看>>
Ubuntu下tensorboard的使用
查看>>
门面模式
查看>>
Navicat Premium 10/12——破解激活
查看>>
【leetcode❤python】 290. Word Pattern
查看>>
Mysql备份还原数据库之mysqldump实例及参数详细说明 -转自http://www.cnblogs.com/xuejie/archive/2013/01/11/2856911.html...
查看>>
2013年10月13日学习:SQL通过命令语句来创建表
查看>>
剑指offer : 二维数组中的查找
查看>>
第三章 python基础
查看>>
java基础题
查看>>
[转]人人店短信插件开发
查看>>
[转]c# System.IO.Ports SerialPort Class
查看>>
14. 最长公共前缀
查看>>
Redis文档
查看>>
项目重构
查看>>
iOS 开发 证书总结 开发证书和生产证书的区别
查看>>
(笔试题)和一半的组合数
查看>>
leetcode--Algorithm--Array_Part 1 Easy- 566 Reshape the Matrix
查看>>