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的更多相关文章

  1. [CareerCup] 13.3 Virtual Functions 虚函数

    13.3 How do virtual functions work in C++? 这道题问我们虚函数在C++中的工作原理.虚函数的工作机制主要依赖于虚表格vtable,即Virtual Table ...

  2. Standard C++ Programming: Virtual Functions and Inlining

    原文链接:http://www.drdobbs.com/cpp/standard-c-programming-virtual-functions/184403747 By Josée Lajoie a ...

  3. [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 ...

  4. [译]GotW #5:Overriding Virtual Functions

       虚函数是一个很基本的特性,但是它们偶尔会隐藏在很微妙的地方,然后等着你.如果你能回答下面的问题,那么你已经完全了解了它,你不太能浪费太多时间去调试类似下面的问题. Problem JG Ques ...

  5. Effective C++ Item 35 Consider alternatives to virtual functions

    考虑你正在为游戏人物设计一个继承体系, 人物有一个函数叫做 healthValue, 他会返回一个整数, 表示人物的健康程度. 由于不同的人物拥有不同的方式计算他们的健康指数, 将 healthVal ...

  6. 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 ...

  7. 多重继承下的virtual functions

    有如下图所示的继承关系: 有如下代码示例:                   在早期的未符合c++标准的的编译器上是会报错的,因为对于clone()函数来说,编译器不知道怎么处理处理.但是时至今日c ...

  8. 条款35:考虑virtual函数以外的其他选择(Consider alternative to virtual functions)

    NOTE: 1.virtual 函数的替代方案包括NVI手法及Strategy设计模式的多种形式.NVI手法自身是一个特殊形式的Template Method设计模式. 2.将机能从成员函数移到外部函 ...

  9. 条款9:绝不在构造和析构过程中调用virtual函数(Never call virtual functions during construction or destruction)

    NOTE:在构造和析构期间不要调用virtual函数,因为这类调用从不下降至derived class(比起当前执行构造函数和析构函数的那层)

  10. Virtual functions in derived classes

    In C++, once a member function is declared as a virtual function in a base class, it becomes virtual ...

随机推荐

  1. 战码先锋直播预告丨参与文档贡献,开启OpenHarmony社区贡献之旅

    OpenAtom OpenHarmony(以下简称"OpenHarmony")工作委员会首度发起「OpenHarmony开源贡献者计划」(本期OpenHarmony开源贡献者计划以 ...

  2. 安装HTMLTestRunner库

    安装 HTMLTestRunner 库的方法非常简单,直接 pip 就可以了 pip install html-testRunner 在 https://pypi.org/  中可以直接搜索到,并且官 ...

  3. Vim 安装与基础操作指南

    0x00 链接 Vim 官网 Vim GitHub Vim 中文文档 0x01 准备 (1)下载与安装 在官网地址找到 Download 标签,在其中根据操作系统选择相应的版本,以下以 Windows ...

  4. ecplice 如何智能提示(旧)

    前言 从my老博客迁移过来的. 正文 1.java智能提示 (1). 打开Eclipse,选择打开" Window - Preferences". (2). 在目录树上选择&quo ...

  5. 重新整理数据结构与算法(c#)—— 树的节点删除[十八]

    前言 你好这里的一个删除,指的是如果删除的叶子节点则直接删除,如果删除的是非叶子节点,则删除的是这颗子树. 这样删除的场景并不多,这种删除方式了解即可. 十七和十六没有放树图,把树图放一下. 正文 节 ...

  6. 【oracle】想要得到一个与输入顺序相同的结果

    [oracle]想要得到一个与输入顺序相同的结果 在Oracle中,输出结果顺序好像是个rowid相同的,也就是经常使用的rownum序列的值,所以可以通过对rownum进行order by来让输出结 ...

  7. Oracle邮件发送(内容中带有收件人独有信息)

    Oracle邮件发送(内容中带有收件人独有信息) Oracle邮件发送(内容中带有收件人独有信息) Oracle发送邮件最简单的应该就是用smtp,具体使用和参数讲解我这儿没有 简单来说,发送邮件的思 ...

  8. 力扣784(java)-字母大小写全排列(中等)

    题目: 给定一个字符串 s ,通过将字符串 s 中的每个字母转变大小写,我们可以获得一个新的字符串. 返回 所有可能得到的字符串集合 .以 任意顺序 返回输出. 示例 1: 输入:s = " ...

  9. 做ToB软件质量保障的这两年

    ​简介:自己算是阿里的老兵了,从实习开始一直投身在 toB 业务的质量保障领域内,不能说是资深的专家,但所经历的.感受的业务特点和体会还是具有一定的代表性,希望能通过这篇文章,总结一下过往,并能和已经 ...

  10. MaxCompute在电商场景中如何进行漏斗模型分析

    简介: 本文以某电商案例为例,通过案例为您介绍如何使用离线计算并制作漏斗图. 背景 漏斗模型其实是通过产品各项数据的转化率来判断产品运营情况的工具.转化漏斗则是通过各阶段数据的转化,来判断产品在哪一个 ...