C++ Virtual Functions

virtual,functions · 浏览次数 : 5

小编点评

**Virtual关键字在多态中的重要角色** 在多态编程中,`virtual`关键字非常重要。它用于声明成员函数是`virtual`关键字的成员函数。任何一个类如果拥有`virtual`函数,就可以得到C++编译器的虚拟机制(virtual mechanism)的服务。 `virtual`关键字的作用是: 1. **虚函数的声明:** `virtual`关键字用于声明一个虚函数,它会在运行时被动态绑定到特定类的实例上。 2. **虚函数的调用:** 通过使用`virtual`关键字,可以调用任何类中的虚函数。 **`virtual`关键字带来的影响** `virtual`关键字的影响是: * 它使得函数是`virtual`类型的。 * 它允许我们通过指针访问基类中的虚函数。 * 它允许我们通过指针访问派生类中的虚函数。 **示例** ```c++ #include using namespace std; class CShape { public: virtual void display() { cout << << "CShape" << endl; } }; class CRect : public CShape { public: void display() { cout << << "CRect" << endl; } }; int main() { CShape* pShape1 = new CShape; pShape1->display(); CRect* pShape2 = new CRect; pShape2->display(); return 0; } ``` **执行结果** ``` CShape CRect ``` **总结** `virtual`关键字在多态编程中非常重要,它用于声明虚函数,并允许我们通过指针访问基类中的虚函数,或者通过指针访问派生类中的虚函数。

正文

  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相似的内容:

C++ Virtual Functions

Virtual这个关键字在多态中扮演一个绝对重要的角色,只要member functions声明的前面加上virtual的关键字,他就会成为 Virtual member functions。任何一个class如果拥有virtual functions,就可以得到C++编译器的虚拟机制(virtua

深入剖析C++多态的实现与原理-详解

目录多态基础虚函数虚函数的继承虚类/虚基类重写/覆盖条件:概念:多态的条件其他的多态行为多态中子类可以不写virtual协变代码举例继承遗留问题解决析构函数具体解决方式:题目1答案:解析:题目2答案:C++11 override和finalfinal功能1:禁用继承使用场景:功能2:禁用重写使用场景

C# 开发技巧 轻松监控方法执行耗时

前言 MethodTimer.Fody 是一个功能强大的库,可以用于测量 .NET 应用程序中的方法的执行时间。允许你在不修改代码的情况下,自动地测量和记录方法的执行时间。 这个工具是基于.NET的 weaving 技术,通过修改IL(Intermediate Language,中间语言)代码来插入

C#开源、简单易用的Dapper扩展类库 - Dommel

前言 今天大姚给大家分享一个C#开源(MIT License)、免费、简单易用的Dapper扩展类库,帮助.NET开发者使用Dapper的CRUD操作变得更简单:Dommel。 项目特性 Dommel 使用 IDbConnection 接口上的扩展方法为 CRUD 操作提供了便捷的 API。 Dom

C语言指针易混淆知识点总结

指针 定义 指针是一个变量,存储另一个变量的内存地址,它允许直接访问和操作内存中的数据,使得程序能够以更灵活和高效的方式处理数据和内存。 获取变量地址:使用取地址符 &。 访问地址上的数据:使用解引用符 *。 例子1 指针是存储另一个变量地址的变量。通过使用取地址符 & 和解引用符 *,我们可以灵活

C++如何在main函数开始之前(或结束之后)执行一段逻辑?

1. 问题 2. 考察的要点 3. 解决策略 3.1. 方案一:使用GCC的拓展功能 3.2. 方案二:使用全局变量 3.3. 方案三:atexit 4. Demo测试 4.1. 测试代码 4.2. 执行结果 5. 程序异常退出场景 5.1. 存在的问题 5.2. 解决方案 5.2.1. 原理 5.

C#/.NET这些实用的编程技巧你都会了吗?

DotNet Exercises介绍 DotNetGuide专栏C#/.NET/.NET Core编程常用语法、算法、技巧、中间件、类库练习集,配套详细的文章教程讲解,助你快速掌握C#/.NET/.NET Core各种编程常用语法、算法、技巧、中间件、类库等等。 GitHub开源地址:https:/

C# 使用模式匹配的好处,因为好用所以推荐~

类型检查和转换:当你需要检查对象是否为特定类型,并且希望在同一时间内将其转换为那个类型时,模式匹配提供了一种更简洁的方式来完成这一任务,避免了使用传统的as和is操作符后还需要进行额外的null检查。 复杂条件逻辑:在处理复杂的条件逻辑时,特别是涉及到多个条件和类型的情况下,使用模式匹配可以使代码更

【C++】使用ort推理yolov10

【C++】使用ort推理yolov10 前言:由于笔者是编导专业,想玩玩yolo模型,搜来搜去全是python,所以在学会之后写一篇文章帮助和笔者同样情况的人 环境 Windows 10 C++17 onnxruntime18.1(DML版本) opencv4.9 visual studio2022

C++使用gnuplot-cpp库绘制图像

最近想要对一些时变的变量进行可视化,搜索来搜索去选择了使用gnuplot这个工具。 sudo apt-get install gnuplot sudo apt-get install gnuplot-x11 # 使其支持linux终端 这样就安装完gnuplot了。接着可以在命令行中键入gnuplo