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。

相关推荐
Bshaya_9 天前
C++多态详解:运行时多态、虚函数重写与析构函数重写规则
多态·析构函数·虚函数·重写·静态多态
白杨尚青19 天前
C++进阶篇(二):多态——虚函数、重写、虚函数表与三个经典坑(附完整代码仓库)
开发语言·c++·多态·虚函数·重写·动态绑定
布莱克6051 个月前
在C++中,构造函数能不能是虚函数?析构函数为什么要虚?
开发语言·c++·构造函数·析构函数·虚函数
DogDaoDao5 个月前
C++核心技术深度剖析:从底层原理到工程实践
开发语言·c++·面试·程序员·指针·虚函数
少司府5 个月前
C++进阶:多态
c语言·开发语言·c++·多态·抽象类·虚函数·虚表指针
阿昭L5 个月前
虚表hook
hook·逆向工程·虚函数
炘爚6 个月前
深入解析C++多态:虚函数与动态联编
开发语言·c++·多态·虚函数
代码中介商7 个月前
C++运行时多态深度解析:从原理到实践
开发语言·c++·多态·虚函数
消失的旧时光-19438 个月前
C++ 多态核心三件套:虚函数、纯虚函数、虚析构函数(面试 + 工程完全指南)
开发语言·c++·面试·虚函数·纯虚函数·虚析构函数
三月微暖寻春笋9 个月前
【和春笋一起学C++】(六十一)公有继承中的多态
c++·多态·virtual·基类·虚函数·公有继承