全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

c++虚函数是什么 c++多态与虚函数实现【教程】

虚函数是C++实现运行时多态的核心机制,通过virtual声明、vtable动态绑定实现基类指针调用派生类重写函数;析构函数应为虚函数,构造函数不能为虚函数,纯虚函数定义抽象类。

虚函数是 C++ 中实现运行时多态的核心机制,它允许基类指针或引用调用派生类中重写的函数,具体执行哪个版本由对象的实际类型决定,而不是指针或引用的静态类型。

虚函数怎么声明和使用

在基类中用 virtual 关键字修饰成员函数,就把它变成虚函数。派生类中同名、同参数、同返回类型的函数会自动成为虚函数(即使不写 virtual),也可以显式加上 override(推荐)来增强可读性和编译检查。

  • 虚函数必须是类的成员函数,不能是全局函数或静态成员函数
  • 构造函数不能是虚函数(对象还没完全生成)
  • 析构函数建议声明为虚函数,尤其是当类可能作为基类被继承时,防止派生类资源泄漏

多态是怎么靠虚函数工作的

C++ 编译器为含有虚函数的类生成一个虚函数表(vtable),每个对象开头隐含一个指向该表的指针(vptr)。vtable 中按声明顺序存放虚函数地址。当通过基类指针调用虚函数时,程序查 vptr → 找 vtable → 取对应函数地址 → 跳转执行,这个过程在运行时完成,所以叫“动态绑定”或“晚绑定”。

  • 普通非虚函数调用在编译期就确定地址,叫“早绑定”
  • 只有通过基类指针或引用调用虚函数,才会触发多态;直接用对象调用(如 obj.func())仍是静态绑定
  • 纯虚函数(virtual void func() = 0;)让类变成抽象类,不能实例化,强制派生类实现

常见误区和注意事项

虚函数不是万能的,用错反而引发问题。比如,把不该多态的函数设为虚函数会增加对象体积(每个对象多一个 vptr)和调用开销(间接跳转);反过来,该虚却不虚,就无法体现多态行为。

  • 不要在构造/析构函数中调用虚函数:此时 vptr 指向当前正在构造或析构的类的 vtable,不会调到派生类的重写版本
  • 返回类型协变允许派生类虚函数返回更具体的类型(如基类返回 Base*,派生类可返回 Derived*),但参数列表必须严格一致
  • 虚函数可以有默认参数,但默认值由静态类型决定,容易混淆,建议避免在虚函数中使用默认参数

一个简单可运行的例子

下面代码展示了虚函数如何支撑多态:

#include 
using namespace std;

class Animal { public: virtual void speak() { cout << "Animal makes a sound\n"; } virtual ~Animal() = default; // 虚析构很重要 };

class Dog : public Animal { public: void speak() override { cout << "Dog barks\n"; } };

class Cat : public Animal { public: void speak() override { cout << "Cat meows\n"; } };

int main() { Animal a1 = new Dog(); Animal a2 = new Cat(); a1->speak(); // 输出 Dog barks a2->speak(); // 输出 Cat meows delete a1; delete a2; }

输出结果取决于 new 出来的实际对象类型,而不是 Animal* 的类型 —— 这就是多态的本质。


# ai  # c++  # ios  # stream  # speak  # 多态  # 成员函数  # 构造函数  # 析构函数  # 引用调用  # void  # 指针  # 继承  # 虚函数  # 纯虚函数  # 对象  # 绑定  # 派生类  # 重写  # 类中  # 或引用  # 跳转  # 而不是  # 还没  # 抽象类 


相关文章: 定制建站方案优化指南:企业官网开发与建站费用解析  网站代码制作软件有哪些,如何生成自己网站的代码?  如何在阿里云虚拟主机上快速搭建个人网站?  早安海报制作网站推荐大全,企业早安海报怎么每天更换?  如何在景安服务器上快速搭建个人网站?  广州建站公司哪家好?十大优质服务商推荐  实现虚拟支付需哪些建站技术支撑?  建站之星微信建站一键生成小程序+多端营销系统  如何在云虚拟主机上快速搭建个人网站?  如何快速搭建支持数据库操作的智能建站平台?  西安市网站制作公司,哪个相亲网站比较好?西安比较好的相亲网站?  ,制作一个手机app网站要多少钱?  建站之星如何快速解决建站难题?  建站之星价格显示格式升级,你的预算足够吗?  网页设计与网站制作内容,怎样注册网站?  详解ASP.NET 生成二维码实例(采用ThoughtWorks.QRCode和QrCode.Net两种方式)  公司网站制作费用多少,为公司建立一个网站需要哪些费用?  如何在Golang中引入测试模块_Golang测试包导入与使用实践  平台云上自助建站如何快速打造专业网站?  大同网页,大同瑞慈医院官网?  网站制作服务平台,有什么网站可以发布本地服务信息?  高防服务器:AI智能防御DDoS攻击与数据安全保障  如何在阿里云香港服务器快速搭建网站?  小程序网站制作需要准备什么资料,如何制作小程序?  厦门模型网站设计制作公司,厦门航空飞机模型掉色怎么办?  网站制作公司排行榜,四大门户网站排名?  制作网站公司那家好,网络公司是做什么的?  建站之星如何保障用户数据免受黑客入侵?  在线教育网站制作平台,山西立德教育官网?  高防服务器租用首荐平台,企业级优惠套餐快速部署  如何在宝塔面板中修改默认建站目录?  较简单的网站制作软件有哪些,手机版网页制作用什么软件?  专业商城网站制作公司有哪些,pi商城官网是哪个?  湖州网站制作公司有哪些,浙江中蓝新能源公司官网?  制作农业网站的软件,比较好的农业网站推荐一下?  如何用西部建站助手快速创建专业网站?  如何通过VPS搭建网站快速盈利?  如何快速生成专业多端适配建站电话?  TestNG的testng.xml配置文件怎么写  如何在阿里云服务器自主搭建网站?  邀请函制作网站有哪些,有没有做年会邀请函的网站啊?在线制作,模板很多的那种?  西安大型网站制作公司,西安招聘网站最好的是哪个?  电影网站制作价格表,那些提供免费电影的网站,他们是怎么盈利的?  公众号网站制作网页,微信公众号怎么制作?  建站之星图片链接生成指南:自助建站与智能设计教程  怎么将XML数据可视化 D3.js加载XML  阿里云网站制作公司,阿里云快速搭建网站好用吗?  沈阳制作网站公司排名,沈阳装饰协会官方网站?  如何在Ubuntu系统下快速搭建WordPress个人网站?  企业微网站怎么做,公司网站和公众号有什么区别? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。