当前位置: 首页 > news >正文

C++之虚函数 Virtual Function

1. 普通虚函数(Virtual Function)

  • 定义:基类中用 virtual 声明,允许派生类 覆盖(Override)
  • 特点
    • 基类可提供默认实现。
    • 派生类可选择性覆盖(若不覆盖,则调用基类版本)。
  • 示例
    class Shape {
    public:virtual void draw() {cout << "Drawing a shape." << endl;}
    };
    

2. 纯虚函数(Pure Virtual Function)

  • 定义:基类中用 virtual 声明并以 = 0 结尾,强制派生类必须实现。

  • 特点:

    • 基类成为 抽象类(Abstract Class),无法实例化。
    • 用于定义接口规范,强制派生类遵守。
  • 示例

    class Shape {
    public:virtual void draw() = 0; // 纯虚函数
    };
    

3. 虚析构函数(Virtual Destructor)

  • 定义:基类的析构函数声明为 virtual,确保派生类对象通过基类指针删除时,能正确调用派生类的析构函数。
  • 场景:基类指针指向派生类对象时,必须使用虚析构函数以避免资源泄漏。
  • 现象:先执行派生类析构函数,再执行基类析构函数
#include <iostream>// 基类
class Base {
public:// 虚析构函数virtual ~Base() {std::cout << "Base class destructor" << std::endl;}
};// 派生类
class Derived : public Base {
public:~Derived() override {std::cout << "Derived class destructor" << std::endl;}
};int main() {// 通过基类指针创建派生类对象Base* basePtr = new Derived();// 删除基类指针delete basePtr;return 0;
}    

4. 关键词 (C++11)

一、override

显式标记派生类中对基类虚函数的重写,强制编译器检查函数签名是否完全匹配,避免因拼写错误或参数不匹配导致意外定义新函数

二、final

修饰类:禁止类被继承(如工具类或不可变类)。
修饰虚函数:禁止派生类进一步重写该函数(如关键算法或接口)。

class Base {
public:virtual void log() final { // 禁止派生类覆盖cout << "Base log." << endl;}
};
#include <iostream>// 基类
class Base {
public:// 虚函数virtual void print() {std::cout << "This is the Base class." << std::endl;}
};// 派生类
class Derived : public Base {
public:// 重写基类的虚函数void print()final {std::cout << "This is the Derived class." << std::endl;}
};// 派生类的派生类
/*
class Deriveder : public Derived {
public:// 重写基类的虚函数void print() override {std::cout << "This is the Deriveder class." << std::endl;}
};
*/// 多态函数
void callPrint(Base* obj) {obj->print();
}int main() {Base base;Derived derived;//Deriveder Deriveder;// 调用多态函数callPrint(&base);callPrint(&derived);//callPrint(&Deriveder);return 0;
}  
http://www.xdnf.cn/news/28315.html

相关文章:

  • Redis 的持久化机制(RDB, AOF)对微服务的数据一致性和恢复性有何影响?如何选择?
  • 零基础上手Python数据分析 (18):Matplotlib 基础绘图 - 让数据“开口说话”
  • FPGA——基于DE2_115实现DDS信号发生器
  • FPGA IO引脚 K7-认知4
  • 【java实现+4种变体完整例子】排序算法中【插入排序】的详细解析,包含基础实现、常见变体的完整代码示例,以及各变体的对比表格
  • windows下用xmake交叉编译鸿蒙.so库
  • 交换机与路由器的主要区别:深入分析其工作原理与应用场景
  • hackmyvm-airbind
  • 【人工智能学习-01-01】20250419《数字图像处理》复习材料的word合并PDF,添加页码
  • AI 趋势下 Python 的崛起:深度剖析
  • Nginx 报错403 排查与解决
  • Oracle Recovery Tools修复ORA-600 6101/kdxlin:psno out of range故障
  • CSS中的`transform-style`属性:3D变换的秘密武器
  • 【每日八股】复习计算机网络 Day2:TCP 断开连接时四次挥手及其相关问题
  • 关于大型语言模型的“生物学”
  • 功能性高斯泼溅扩散——DiffGS: Functional Gaussian Splatting Diffusion
  • 203. 移除链表元素
  • B端可视化像企业数据的透视镜,看清关键信息
  • pytorch 51 GroundingDINO模型导出tensorrt并使用c++进行部署,53ms一张图
  • Python制作简易PDF查看工具PDFViewerV1.0查找功能优化
  • 前端vue+后端ssm项目
  • 健身会员管理系统(ssh+jsp+mysql8.x)含运行文档
  • 【C++】多态
  • Linux操作系统--环境变量
  • [密码学基础]GM/T 0018-2023 密码设备应用接口规范深度解析:技术革新与开发者实践
  • 机器学习+深度学习
  • Java中包装类和泛型
  • 八股文---Redis(1)
  • 论文降重GPT指令-实侧有效从98%降低到8%
  • OrbisGIS:基于Java开发的开源GIS软件