【学习笔记】虚函数+虚析构函数

【学习笔记】虚函数+虚析构函数

1、虚函数

虚函数是类中使用 virtual 关键字声明的成员函数,它允许子类(派生类)重新定义(覆盖)该函数,从而在运行时根据对象的实际类型动态决定调用哪个版本的函数。

多态性是面向对象编程的三大特性之一(封装、继承、多态),指的是同一函数调用可以根据对象类型的不同,执行不同的操作。

c++ 复制代码
class Base {
   public:
   Base();
   virtual ~Base();

..........

    virtual int UpdataIP(MIO_JSON* pJson);
}

int Base::UpdataIP(MIO_JSON* pJson) 
{
    return 0;
}

Base 类中有一个虚函数 UpdataIP,但是在这个类中这个虚函数并没有实际意义。但是Hahanode以及Hehenode继承了这个类,在这两个继承类中分别对这个函数做了不一样的操作。

c++ 复制代码
class HahaNode : public Base {
   public:
    HahaNode();
    ~HahaNode();

    int UpdataIP(MIO_JSON* pJson);
..........
}

int HahaNode::UpdataIP(MIO_JSON* pJson) 
{
    // 实际操作
}

class HeheNode : public Base {
   public:
    HeheNode();
    ~HeheNode();

    int UpdataIP(MIO_JSON* pJson);
..........
}

int HeheNode::UpdataIP(MIO_JSON* pJson) 
{
    // 实际操作
}

2、虚析构函数

​ 为什么一般将析构函数设置为虚函数。

​ 防止内存泄漏:当基类析构函数不是虚函数时,要是通过基类指针删除派生类对象,系统只会调用基类的析构函数,而不会调用派生类的析构函数。这就可能使派生类特有的资源(像动态分配的内存、文件句柄、网络连接等)无法被释放,进而造成内存泄漏。

虚析构函数的作用:把析构函数声明为虚函数之后,在运行时会依据对象的实际类型来决定调用哪个析构函数,而不是根据指针的静态类型。这样一来,当通过基类指针删除派生类对象时,派生类的析构函数会先被调用,接着基类的析构函数也会被调用,从而确保所有资源都能被正确释放。

c++ 复制代码
#include <iostream>

class Base {
public:
    Base() { std::cout << "Base Constructor" << std::endl; }
    // 若不声明为虚函数,可能会引发问题
    virtual ~Base() { std::cout << "Base Destructor" << std::endl; }
};

class Derived : public Base {
private:
    int* data;
public:
    Derived() {
        std::cout << "Derived Constructor" << std::endl;
        data = new int[100]; // 动态分配内存
    }
    ~Derived() override {
        std::cout << "Derived Destructor" << std::endl;
        delete[] data; // 释放派生类资源
    }
};

int main() {
    Base* ptr = new Derived(); // 基类指针指向派生类对象
    delete ptr; // 调用虚析构函数,确保资源正确释放
    return 0;
}

结果:

c++ 复制代码
Base Constructor        //创建基类构造函数
Derived Constructor     //创建派生类构造函数
Derived Destructor      //删除派生类析构函数
Base Destructor         //删除基类析构函数

如果基类析构函数不是虚函数,那么delete ptr只会调用Base::~Base(),派生类的析构函数不会被调用,data所占用的内存就无法被释放。

相关推荐
神仙别闹18 分钟前
基于 C++ 实现(控制台)学生成绩管理系统
开发语言·c++
会周易的程序员19 分钟前
5 节点边缘冗余方案(上):基于 aiRaft 的物联网高可用控制面设计
c++·分布式·物联网·raft·iot·共识
智者知已应修善业2 小时前
【4060BD_5V应用电路图】2022-12-24
驱动开发·经验分享·笔记·硬件架构·硬件工程
小弥儿3 小时前
GitHub今日热榜 | 2026-09-18:腾讯双项目上榜
学习·开源
qq_199886873 小时前
第6板块·第4节:构建系统与多文件项目
c++·人工智能·gpu算力
知识分享小能手5 小时前
深度学习学习教程,从入门到精通,深度生成模型 —— 知识点详解与代码实现(20)
人工智能·深度学习·学习
汉克老师5 小时前
GESP2026年9月认证C++三级( 第三部分编程题(2、分割字符串))精讲
c++·gesp·小学生·学c++编程
估值探索者5 小时前
【Python量化系统工程化 #08】关了 SSH 就停?systemd 让脚本开机自启 + 异常自动拉起
java·c++·人工智能·分类·数据挖掘
m4Rk_5 小时前
【论文阅读】Agent 记忆机制(74):CompassMem——从相似度检索走向事件图上的记忆导航
论文阅读·人工智能·学习·开源·github
小李不想当小白5 小时前
DMA直接存储器存取(STM32标准库学习笔记)
笔记·stm32·单片机·嵌入式硬件·学习·分享