当前位置: 首页 > 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;
}  

相关文章:

  • Matlab画海洋与大气变量的时间序列并带标记面的三维折线图--来源粉丝
  • 如何对docker镜像存在的gosu安全漏洞进行修复——筑梦之路
  • Macvlan 网络类型详解:特点、优势与局限性
  • C++入门七式——模板初阶
  • Nacos启动报错
  • 软件测试行业核心知识点的系统化梳理
  • 使用 TensorFlow 和 Keras 构建 U-Net
  • Python语法系列博客 · 第9期[特殊字符] 函数参数进阶:*args、**kwargs 与参数解包技巧
  • 混合精度训练中的算力浪费分析:FP16/FP8/BF16的隐藏成本
  • 深度学习--mnist数据集实现卷积神经网络的手写数字识别
  • 探索大语言模型(LLM):Transformer 与 BERT从原理到实践
  • 【OpenGL】OpenGL学习笔记-1:VS2019配置OpenGL开发环境
  • PR第一课
  • Arduino项目中硬件包括哪些部分
  • 【MATLAB海洋专题】历史汇总
  • 链表面试题
  • 用思维导图解锁计算机科学导论的知识宝库
  • 取值运算符*和地址运算符
  • MYSQL初阶(暂为自用草稿)
  • [密码学基础]GM/T 0018-2023 密码设备应用接口规范深度解析:技术革新与开发者实践
  • 多元布局、抱团取暖……上海虹口区召开外向型企业圆桌会议
  • 白宫慌了!将设工作组紧急处理对中国加征关税危机
  • 观察|美军在菲律宾部署新导弹,试图继续构建“导弹链”
  • 【社论】让民营企业在上海大显身手
  • 当美国掀翻了自己的全球化牌桌
  • 二十届中央第五轮巡视进驻过半