欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 健康 > 美食 > 虚函数 vs 纯虚函数 vs 静态函数(C++)

虚函数 vs 纯虚函数 vs 静态函数(C++)

2025/5/5 16:02:25 来源:https://blog.csdn.net/weixin_51623910/article/details/147702995  浏览:    关键词:虚函数 vs 纯虚函数 vs 静态函数(C++)

🧩 一图看懂:虚函数 vs 纯虚函数

特性虚函数(Virtual)纯虚函数(Pure Virtual)
语法virtual void foo();virtual void foo() = 0;
是否必须实现✅ 必须在类中实现❌ 不在基类实现,派生类必须实现
是否可被重写✅ 可重写(override)✅ 必须被重写(override)
用途支持运行时多态,可选重写强制派生类必须重写,实现接口规范
是否构成抽象类❌ 不一定✅ 是抽象类,不能实例化

✅ 虚函数(virtual

  • 语法virtual void speak();

  • 作用:支持 运行时多态

  • 特性

    • 有默认实现

    • 可以被子类覆盖

    • 必须是非静态成员函数

  • 使用场景:需要在子类中覆盖行为(但不是强制)


✅ 纯虚函数(= 0

  • 语法virtual void speak() = 0;

  • 作用:创建接口函数,强制子类必须实现

  • 特性

    • 没有默认实现

    • 子类 必须重写,否则也是抽象类

    • 所在类称为 抽象类不能被实例化

  • 用途:面向接口编程、设计规范

class Animal {

public:

    virtual void speak() = 0; // 纯虚函数

};


✅ 静态成员函数(static

  • 属于类本身,而不是对象

  • 不能是虚函数,因为没有 this 指针

  • 无法访问非静态成员(因为不依赖对象)

class A {

public:

  static void sayHello(); // 和对象无关

};


🧠 三、抽象类(包含纯虚函数的类)

  • 语法:类中至少一个函数是 virtual void foo() = 0;

  • 特点

    • 不能被实例化

    • 派生类必须实现纯虚函数,才可以实例化

    • 通常作为接口使用,规范子类的行为


📌 四、虚函数工作原理:虚函数表(vtable)

  • 编译器为类创建一张虚函数表

  • 对象内部有个隐藏指针指向这个表(vptr)

  • 当你调用虚函数时,实际会通过 vtable 找到正确的函数地址 ➜ 实现多态

🔑 小结:口诀记忆版

项目口诀
const 指针左定值,右定向,const 修饰不变量
虚函数支持多态,可选覆盖
纯虚函数没有实现,强制子类实现,是接口
抽象类有纯虚函数,不可实例化,只能继承
静态函数类级函数,不能访问对象成员,不能是虚函数
多态原则通过指针/引用访问虚函数,才会发生运行时多态
析构函数如果类有虚函数,析构函数也应为虚函数,防止内存泄漏

详情请见:C++ 虚函数和纯虚函数的区别 | 菜鸟教程

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词