【C++进阶学习】第三讲----多态的概念和使用

目录

一.多态的概念

二.多态的定义及实现

[三. 重载/重写/隐藏的对比](#三. 重载/重写/隐藏的对比)

[​编辑 四.override 和 final 关键字](#编辑 四.override 和 final 关键字)

五.纯虚函数和抽象类

六.总结


一.多态的概念

通俗来说,就是多种形态。多态分为编译时多态(静态多态)和运行时多 态(动态多态),这⾥我们重点讲运行时多态,编译时多态(静态多态)和运行时多态(动态多态)。

具体点就是去完成某个行为(函数),比如,同样是动物叫的⼀个行为(函数),传猫对象过去,就是"(>^ω^<) 喵",传狗对象过去,就是"汪汪"。

二.多态的定义及实现

多态实现的条件:

1.必须是基类的指针或引用,因为只有基类的指针或引用才能既指向派生类对象;

2.派生类必须对基类的虚函数重写/覆盖,重写或者覆盖了,派生类才能有不同的函数,多态的不同形态效果才能达到。

3、派生类必须重写基类的虚函数: 派生类需要重写基类中的虚函数,以提供特定于派生类的实现。重写时,函数签名(包括返回类型、函数名和参数列表)必须与基类中的虚函数完全匹配。在C++11及以后的版本中,可以使用override关键字显式声明派生类中的函数是重写基类的虚函数,这有助于编译器检查是否正确重写了虚函数。

4、使用虚析构函数: 如果基类中使用了虚函数,通常建议也将析构函数声明为虚函数。这是因为当通过基类指针删除派生类对象时,如果析构函数不是虚函数,将只会调用基类的析构函数,而不会调用派生类的析构函数,这可能导致资源泄漏。

cpp 复制代码
 class Person {
 public:
 virtual void BuyTicket() { cout << "买票全价" << endl; }
 };
 class Student : public Person {
 public:
 virtual void BuyTicket() { cout << "买票打折" << endl; }
 };
 void Func(Person* ptr)
 {
 // 这⾥可以看到虽然都是Person指针Ptr在调⽤BuyTicket 
// 但是跟ptr没关系,⽽是由ptr指向的对象决定的。
 
ptr->BuyTicket();
 }
 int main()
 {
 Person ps;
 Student st;
 Func(&ps);
 Func(&st);
 return 0;
}
 

三. 重载/重写/隐藏的对比

四.override 和 final 关键字

C++对函数重写的要求比较严格,但是有些情况下由于疏忽,比如函数名写错参数写 错等导致无法构成重载,而这种错误在编译期间是不会报出的,只有在程序运行时没有得到预期结果才来debug会得不偿失,因此C++11提供了override,可以帮助用户检测是否重写。如果我们不想让派生类重写这个虚函数,那么可以用final去修饰。

五.纯虚函数和抽象类

在虚函数的后面写上=0,则这个函数为纯虚函数,纯虚函数不需要定义实现(实现没啥意义因为要被 派⽣类重写,但是语法上可以实现),只要声明即可。包含纯虚函数的类叫做抽象类,抽象类不能实例化出对象,如果派生类继承后不重写纯虚函数,那么派生类也是抽象类。纯虚函数某种程度上强制了 派生类重写虚函数,因为不重写实例化不出对象。

cpp 复制代码
 class Car
 {
 public:
 virtual void Drive() = 0;
 };
 class Benz :public Car
 {
 public:
 virtual void Drive()
 {
 cout << "Benz舒适" << endl;
 }
 };


class BMW :public Car
 {
 public:
 virtual void Drive()
 {
 cout << "BMW操控" << endl;
 }
 };

 int main()
 {
 // 
编译报错:
Car car;

error C2259: "Car": 
⽆法实例化抽象类
 

 Car* pBenz = new Benz;

 pBenz->Drive();

 Car* pBMW = new BMW;

 pBMW->Drive();
 return 0;
 }

六.总结

以上就是C++中多态的基本知识,总的来说并不是很难,,这个与前面继承那个类似,都是很重要的知识点,这些我们放在后面统一讲解。

相关推荐
阿里嘎多学长7 小时前
2026-10-20 GitHub 热点项目精选
开发语言·程序员·github·代码托管
dadaobusi8 小时前
学习: PCIe 6.0 的 L0p
学习
布吉岛的石头8 小时前
Java 程序员第 50 阶段2:预训练的目标函数:自回归语言建模本质
java·开发语言·人工智能·深度学习·回归·transformer
小羊没烦恼!8 小时前
铁道部新客票系统设计(二)
开发语言·前端·数据库·python·oracle·c#·php
quantdash_cc9 小时前
从实时行情到价格观察表:用 Python 和 Pandas 构建策略输入数据
开发语言·python·数据分析·pandas·量化交易·股票数据·quantdash
燕落南枝10 小时前
CSS 学习:类型选择器与 AI 注释实战
css·人工智能·学习
昂好的day10 小时前
VisionMaster 通信模块实战(上):Modbus、TCP 收发、协议组装解析
开发语言·网络·网络协议·tcp/ip·c#
努力实干11 小时前
面向对象设计原则——C++
开发语言·c++·数码相机
NetX行者12 小时前
四语言 Hello World 背后:编译模型与运行时对比
开发语言
Pin_Qing13 小时前
账单没超,请求先被拒了
大数据·开发语言·人工智能