C++:动态多态(虚函数+继承)
创作时间:
作者:
@小白创作中心
C++:动态多态(虚函数+继承)
引用
CSDN
1.
https://blog.csdn.net/weixin_62946182/article/details/136366623
虚函数是C++中实现动态多态性的关键机制。通过在基类中声明虚函数,并在派生类中重写这些虚函数,可以实现运行时的多态性。本文将详细介绍虚函数的概念、用法以及相关注意事项,并通过代码示例帮助读者更好地理解虚函数的实现原理。
虚函数和虚继承
关键字 “virtual”:
虚函数,加在函数前
class 类名 { ... virtual 返回值类型 函数名(参数列表); };虚继承,加在继承方式前
//class A : virtual public B class 派生类类名:virtual 继承方式 基类类名
虚函数说明
- 只有类的成员函数可以定义为虚函数,非类的成员函数不能
- 构造函数无法定义为虚函数,析构函数可以定义为虚函数
- 虚函数一般不能声明为内联函数,虚函数的调用采用动态绑定,内联函数采用静态绑定,虽然虚函数在类内定义(默认为内联函数),但是虚函数作为特例,C++编译器也将它视为非内联函数
- 声明函数时加 “virtual",定义时不加 ”virtual"
- 作为基类的成员函数被声明为虚函数时,其派生类可以继承其同名虚函数,派生类成员函数前 “virtual" 关键字推荐加上,使得程序清晰明了
- 派生类没有重新覆盖同名虚函数,则自动继承其基类虚函数
- 派生类的虚函数若返回值、函数名、参数列表、const 限定与基类的虚函数不一致时,无法实现函数覆盖,其作用等同于添加新函数或进行函数重载
虚函数示例
虚函数动态是实现动态多态的基础,传入什么类型的对象则调入该对象对应的函数
//动态多态,(虚函数)
#include <iostream>
#include <string>
using namespace std;
class Shape
{
public:
virtual void show()
{
cout << "这是图形" << endl;
}
};
class Circle:public Shape
{
public:
virtual void show()
{
cout << "这是圆形" << endl;
}
};
class Square :public Shape
{
public:
virtual void show()
{
cout << "这是正方形" << endl;
}
};
void test1(Shape& s)
{
s.show();
}
int main()
{
Shape s1;
Circle c;
Square s2;
test1(s1);
test1(c);
test1(s2);
return 0;
}
动态多态总结
前提条件:
- 含有继承派生关系
- 子类覆盖父类的虚函数
注意事项:
- 含有父类的引用、指针:”C++ 对象传参:推荐使用引用,其次指针“
- 子类同名覆盖父类的虚函数(override),则要求子类函数:返回值类型、函数名、参数列表、const 限定与父类虚函数一致。
区别(同名覆盖、同名隐藏):
- 同名覆盖,作用于虚函数:子类覆盖继承父类的虚函数,数据被覆盖后丢失
- 同名隐藏,作用于普通函数(非虚函数),是子类隐藏父类的数据,未丢失
共同点:
子类实现与父类相同的函数(函数名、参数列表、返回值、const 限定),仅函数体内容改变
函数重载与二者区别:
函数重载是普通函数中,仅函数名和返回值与原函数一致,参数列表(参数个数、类型不同)、函数主体不同的函数,重载函数与原函数共存,数据均未丢失
C++11中的final和override说明符
override:
格式:
virtual void show2 (int a, int b) override {};
虚函数关键字 函数返回值 函数名( 参数列表 ) 覆盖关键字 函数主体;
为了避免子类在覆盖过程中,与父类的参数不一致时出现误操作导致多态无法实现,override关键字添加在虚函数声明最后,它显式的告诉编译器,当前函数一定是覆盖基类中的虚函数
帮助我们判断该覆盖是否成功,错误时编译器报错提示:
错误原因:函数名不一致
错误原因: 原父类的虚函数无const 限定
错误原因:无法覆盖非虚函数
错误原因:
1、参数列表不一致
2、返回值类型不一致+参数列表不一致
final:
格式:
void f1 (int) final;
返回值类型 函数名(参数列表) final关键字;
在虚函数后添加 “final” 关键字,标志着此次是对虚函数的最终覆盖,此后任何覆盖虚函数的操作都是错误的
- 继68行,类B对虚函数的覆盖后添加关键字“final”限定最终覆盖情况
- 73行,对类B的覆盖与关键字“final"冲突,导致错误
- 78行,对类A的覆盖与类B 虚函数的限制无关,所以通过
热门推荐
为什么要对不同周期K线进行分析
俄国的巅峰:担任欧洲宪兵时的沙俄,能和华约老大苏联平分秋色吗?
胆囊穿刺引流出什么颜色才正常
兰寿金鱼:温和优雅的观赏鱼
二级建造师考试答题技巧:提高答题速度与准确率
耳朵总是痒,却啥也掏不出来?可能暗示这 5 种问题,快自查
总跌倒是平衡能力差?建议进行平衡能力训练
Nature子刊:移动机器人用于老年人的骨盆扰动实验,可改善其平衡和认知表现
手机贴膜完全指南:各类材质特点与正确贴膜技巧详解
起诉能拍卖厂房:实务操作要点及风险防范
使用Go语言实现区块链技术详解
三班两倒是怎么上班的?了解三班两倒工作制的安排与特点
H型钢全面质量检测指南:确保建筑安全之基!
孔子为何说 “不知命,无以为君子”
osu!谱面编辑器作曲标签页功能详解
新手养虎皮丨鹦鹉冬天保暖指南(保暖工具+注意事项)
十大赶海必备实用工具推荐 赶海需要准备哪十种装备
十大赶海必备实用工具推荐 赶海需要准备哪十种装备
轻松学会芋圆的做法,自制Q弹美味芋圆的详细步骤
一斤木头燃烧之后剩下不到一两灰烬,其他9两物质去哪了?
有人向你借钱?这六句话帮你优雅应对
全国软件工程专业大学排名一览表
详解SWIFT:国际金融通信的基石
聚焦政策“组合拳”下的中国房地产市场,CMF专题报告发布
人工智能2024:模型端OpenAI走下神坛,应用端商业化渐清晰
金黄色葡萄球菌临床检测方法全解析
金黄色葡萄球菌三种检测方法详解
从恩施土家族自治州到重庆的距离、交通路线及出行方式详解
健康的双足,应该具备5个特点
室内健身器材怎么使用?这份详细指南请收好