C++ Virtual Functions
Virtual这个关键字在多态中扮演一个绝对重要的角色,只要member functions声明的前面加上virtual的关键字,他就会成为 Virtual member functions。任何一个class如果拥有virtual functions,就可以得到C++编译器的虚拟机制(virtual mechanism)的服务。这个class的所有derived classes,也都会继承这些virtual functions。derived class决定重新定义virtual functions(而不再沿用base class的定义),这个动作称为override(改写),这时候我们需要在derived class中重新声明virtual functions并重新定义代码。重新声明时不需要特别再加上virtual字眼,可以说是“一代为virtual,世代为virtual"。不过,我建议不厌其烦地在derived classes中为每一个你想要重新定义的virtual functions都加上virtual关键字,这对于代码的可读性有帮助。
Virtual functions的妙用,在Inheritance(继承)和Polymorphism(多态)情况下才会发挥得淋漓尽致,以下我们以一个简单的例子来展示一下virtual functions带来的影响:
1 #include <iostream>
2
3 using namespace std;
4
5 class CShape
6 {
7 public:
8 virtual void display(){cout<<"CShape"<<endl;};
9
10 protected:
11 int m_color;
12 };
13
14 class CRect:public CShape
15 {
16 public:
17 void display(){cout <<"CRect"<<endl;};
18
19 };
20
21
22 int main()
23 {
24 CShape* pShape1=new CShape;
25 pShape1->display();//输出CShape
26 CShape* pShape2=new CRect;//polymorphic
27 pShape2->display();//输出CRect;
28
29 return 0;
30 }
执行结果很妙,我们以相同的类型指针(CShape)呼叫相同的函数(至少表面上看相同),但结果却是:

显然所唤起的virtual function因为指标真正指向的object不同而不同。正是如此,以base type pointer指向derived type object,就是所谓的polymorphism(多型),搭配virtual functions,可以有非常大威力,但请注意,这个威力唯有透过指针的形式才得以呈现。拥有virtual functions的class,我们就给予它一个特别的名称:polymorphic class。
C++ Virtual Functions的更多相关文章
- [CareerCup] 13.3 Virtual Functions 虚函数
13.3 How do virtual functions work in C++? 这道题问我们虚函数在C++中的工作原理.虚函数的工作机制主要依赖于虚表格vtable,即Virtual Table ...
- Standard C++ Programming: Virtual Functions and Inlining
原文链接:http://www.drdobbs.com/cpp/standard-c-programming-virtual-functions/184403747 By Josée Lajoie a ...
- [C++] OOP - Virtual Functions and Abstract Base Classes
Ordinarily, if we do not use a function, we do not need to supply a definition of the function. Howe ...
- [译]GotW #5:Overriding Virtual Functions
虚函数是一个很基本的特性,但是它们偶尔会隐藏在很微妙的地方,然后等着你.如果你能回答下面的问题,那么你已经完全了解了它,你不太能浪费太多时间去调试类似下面的问题. Problem JG Ques ...
- Effective C++ Item 35 Consider alternatives to virtual functions
考虑你正在为游戏人物设计一个继承体系, 人物有一个函数叫做 healthValue, 他会返回一个整数, 表示人物的健康程度. 由于不同的人物拥有不同的方式计算他们的健康指数, 将 healthVal ...
- Effective C++ Item 9 Never call virtual functions during constrution or destruction
Because such calls would never go to a more derived class than that of currently executing construto ...
- 多重继承下的virtual functions
有如下图所示的继承关系: 有如下代码示例: 在早期的未符合c++标准的的编译器上是会报错的,因为对于clone()函数来说,编译器不知道怎么处理处理.但是时至今日c ...
- 条款35:考虑virtual函数以外的其他选择(Consider alternative to virtual functions)
NOTE: 1.virtual 函数的替代方案包括NVI手法及Strategy设计模式的多种形式.NVI手法自身是一个特殊形式的Template Method设计模式. 2.将机能从成员函数移到外部函 ...
- 条款9:绝不在构造和析构过程中调用virtual函数(Never call virtual functions during construction or destruction)
NOTE:在构造和析构期间不要调用virtual函数,因为这类调用从不下降至derived class(比起当前执行构造函数和析构函数的那层)
- Virtual functions in derived classes
In C++, once a member function is declared as a virtual function in a base class, it becomes virtual ...
随机推荐
- Java 文件处理完全指南:创建、读取、写入和删除文件详细解析
Java 文件操作 文件处理简介 文件处理是任何应用程序的重要部分.Java 提供了许多用于创建.读取.更新和删除文件的方法. Java 文件处理 Java 中的文件处理主要通过 java.io 包中 ...
- C# DevExpress下GridControl控件的增删查改
DevExpress的GridControl控件可以从任何数据源绑定数据并进行增删查改等操作,和VS自带的dataGridView控件对比,GridControl控件可以实现更多自定义的功能,界面UI ...
- Jenkins首次启动慢
场景描述启动Jenkins后,打开网站,发现一直卡在这个启动页面,慢,很慢,非常慢 解决方法 进入Jenkins的安装目录,找到"hudson.model.UpdateCenter.xml& ...
- 模拟spring工作原理
1.配置文件 Service=service.Impl.ServiceImpl saveDao=dao.daoImpl.saveDaoImpl 2.模拟业务层 --接口 Service package ...
- centos7或者centos8下安装google-chrome谷歌浏览器 亲测成功 20220302
第一步: wget https://dl.google.com/linux/direct/google-chrome-stable_current_x86_64.rpm 第二步: 安装 Google ...
- 重磅:FPGA实现MIPI DSI4线720P
1. 液晶屏概述 显示屏LCD MIPI DSI4 lane,支持分辨率720*1280,60HZ彩色显示.用于对接国产GOWIN的NR-9C的开发板和LATTICE的CROSSLINK开发板,显示M ...
- 顺通ERP:精细敏捷的设计理念,得到了消费者的喜爱
顺通ERP是近年来备受关注的一款ERP品牌,其设计精细,操作便捷,备受消费者喜爱.那么,顺通ERP到底怎么样呢?属于什么档次呢? 首先,从品质上来看,顺通ERP具备高度的稳定性,能够确保企业的日常运营 ...
- 注册配置、微服务治理、云原生网关三箭齐发,阿里云 MSE 持续升级
简介: MSE 云原生网关作为托管型的独享实例,与部署业务应用的资源解耦,并支持过载保护.故障自愈.限流降级等功能,确保流量高峰时的稳定性.其优异的性能表现使费芮不需要高规格的资源配置即可支撑大规模的 ...
- 宏杉科技加入阿里云PolarDB开源数据库社区
简介: 宏杉科技签署阿里巴巴开源CLA(Contribution License Agreement, 贡献许可协议), 正式与阿里云PolarDB 开源数据库社区牵手. 宏杉科技签署阿里巴巴开源CL ...
- 为 Serverless Devs 插上 Terraform 的翅膀,实现企业级多环境部署(下)
简介: 在上篇中,主要介绍了 Serverless Devs 多环境功能的使用,用户读完可能会些疑问,本文会就一些常见问题进行下回答. 在上篇中,主要介绍了 Serverless Devs 多环境功能 ...