49 - 多态的概念和意义
创始人
2024-02-16 04:44:38
0

---- 整理自狄泰软件唐佐林老师课程

1. 函数重写回顾

  • 父类中被重写的函数依然会继承给子类
  • 子类中重写的函数将覆盖父类中的函数
  • 通过作用域分辨符(::)可以访问父类中的函数

在这里插入图片描述
p->print()不符合预期,期望调用子类中的print,实际调用父类的print

2. 多态的概念和意义

  • 面向对象中期望的行为:
    • 根据 实际的对象类型 判断如何调用重写函数
    • 父类指针/引用指向父类对象则调用父类对象中定义的函数
    • 父类指针/引用指向子类对象则调用子类中定义的重写函数

在这里插入图片描述

2.1 面向对象中的多态的概念

  • 根据 实际的对象类型 决定函数调用的具体目标
  • 同样的调用语句在实际运行时有多种不同的表现形式
    在这里插入图片描述

2.2 C++语言直接支持 多态 的概念

通过使用 virtual关键字 对多态进行支持

被virtual声明的函数被重写后具有多态 特性

被virtual声明的函数叫做 虚函数

  • 编程实验:多态的初体验
#include 
#include using namespace std;class Parent
{
public:virtual void print(){cout << "I'm Parent." << endl;}
};class Child : public Parent
{
public:void print(){cout << "I'm Child." << endl;}
};void how_to_print(Parent* p)
{p->print();     // 展现多态的行为
}int main()
{Parent p;Child c;how_to_print(&p);    // Expected to print: I'm Parent.how_to_print(&c);    // Expected to print: I'm Child.return 0;
}

在这里插入图片描述

2.3 多态的意义

  • 在程序运行过程中展现出多态的特性
  • 函数重写必须多态实现,否则没有意义
  • 多态是面向对象组件化程序设计的基础特性

2.4 理论中的概念

  • 静态联编

    • 在程序的 编译期间 就能确定 具体的函数调用
      如:函数重载
  • 动态联编

    • 在程序 实际运行后 才能确定 具体的函数调用
      如:函数重写
  • 实例分析:动态联编和静态联编

#include 
#include using namespace std;class Parent
{
public:virtual void func(){cout << "void func()" << endl;}virtual void func(int i){cout << "void func(int i) : " << i << endl;}virtual void func(int i, int j){cout << "void func(int i, int j) : " << "(" << i << ", " << j << ")" << endl;}
};class Child : public Parent
{
public:void func(int i, int j){cout << "void func(int i, int j) : " << i + j << endl;}void func(int i, int j, int k){cout << "void func(int i, int j, int k) : " << i + j + k << endl;}
};void run(Parent* p)
{p->func(1, 2);     // 展现多态的特性// 动态联编
}int main()
{Parent p;p.func();         // 静态联编p.func(1);        // 静态联编p.func(1, 2);     // 静态联编cout << endl;Child c;c.func(1, 2);     // 静态联编cout << endl;run(&p);run(&c);return 0;
}

在这里插入图片描述

2.5 编程实验

#include 
#include using namespace std;class Boss
{
public:int fight(){int ret = 10;cout << "Boss::fight() : " << ret << endl;return ret;}
};class Master
{
public:virtual int eightSwordKill(){int ret = 8;cout << "Master::eightSwordKill() : " << ret << endl;return ret;}
};class NewMaster : public Master
{
public:int eightSwordKill(){int ret = Master::eightSwordKill() * 2;cout << "NewMaster::eightSwordKill() : " << ret << endl;return ret;}
};void field_pk(Master* master, Boss* boss)
{int k = master->eightSwordKill();int b = boss->fight();if( k < b ){cout << "Master is killed..." << endl;}else{cout << "Boss is killed..." << endl;}
}int main()
{Master master;Boss boss;cout << "Master vs Boss" << endl;field_pk(&master, &boss);cout << "NewMaster vs Boss" << endl;NewMaster newMaster;field_pk(&newMaster, &boss);return 0;
}

在这里插入图片描述

3. 小结

  • 函数重写只可能发生在父类和子类之间
  • 根据 实际对象的类型 确定调用的具体函数
  • virtual关键字是C++中支持多态的唯一方式
  • 被重写的虚函数可表现为 多态 的特性

相关内容

热门资讯

拆迁补贴贪污案,开庭后律师紧急... 文/张家豪律师重庆智豪律师事务所高级合伙人 今天想聊一个很特别的职务犯罪案子,这是一起拆迁补偿领域的...
原创 从... 1854年,清文宗咸丰四年,太平天国的国都天京(今南京)发生了一件震动全国的大事。冬官又正丞相陈宗扬...
香港保监局:就风险为本资本制度... 智通财经获悉,媒体此前报道,香港保监局提议一系列新规,拟引导保险资本流向基础设施等资产,这一举措将把...
库里26+6班凯罗21+12 ... 【搜狐体育战报】北京时间12月23日NBA常规赛,主场作战的勇士以120-97击败魔术。库里26分3...
新日股份5.65亿元合同纠纷二... 12月19日,江苏新日电动车股份有限公司(603787.SH,以下简称“新日股份”)发布诉讼进展公告...
庆阳市预防治理未成年人违法犯罪... 12月22日,市委副书记、市委政法委书记王向阳主持召开全市预防治理未成年人违法犯罪工作推进会议,全面...
大庆法援2025年度成绩单 2025年,大庆市各级法律援助机构在市司法局的领导下,以创新机制激活服务效能,以便民服务打通"最后一...
推进房屋体检制度,确保房子更安... 原标题:工人日报社评丨推进房屋体检制度,确保房子更安全更宜居 工人日报评论员 吴迪 房屋体检制度在各...
行政调解丨“问题种子”导致百亩... 齐鲁晚报·齐鲁壹点记者 李文璇 栾海明 一粒种子,关系着千家万户的“粮袋子”和“钱袋子”。2025...
“十五五”时期民间投资发展的法... “十五五”时期是我国基本实现社会主义现代化的关键时期,要落实《民营经济促进法》,从法律和制度上保障平...