【C++】从零开始认识多态

慈云数据 6个月前 (05-14) 技术支持 43 0

在这里插入图片描述

送给大家一句话:

一个犹豫不决的灵魂,奋起抗击无穷的忧患,而内心又矛盾重重,真实生活就是如此。 ​​​​ – 詹姆斯・乔伊斯 《尤利西斯》

_φ(* ̄ω ̄)ノ_φ(* ̄ω ̄)ノ_φ(* ̄ω ̄)ノ

_φ(* ̄ω ̄)ノ_φ(* ̄ω ̄)ノ_φ(* ̄ω ̄)ノ

_φ(* ̄ω ̄)ノ_φ(* ̄ω ̄)ノ_φ(* ̄ω ̄)ノ


从零开始认识多态

  • 1 前言
  • 2 什么是多态
  • 3 多态的构成
    • 3.1 协变
    • 3.2 析构函数的重写
    • 3.3 语法细节
    • 3.4 C++11 override 和 final
    • 3.5 重写(覆盖) - 重载 - 重定义(隐藏)
    • 4 多态的底层实现
      • 4.1 底层实现
      • 4.2 验证虚表
      • 5 抽象
      • 6 多继承中的多态
        • 一般的多继承
        • 菱形继承和菱形虚拟继承
        • Thanks♪(・ω・)ノ谢谢阅读!!!
        • 下一篇文章见!!!

          1 前言

          面向对象技术(oop)的核心思想就是封装,继承和多态。通过之前的学习,我们了解了什么是封装,什么是继承。

          封装就是对将一些属性装载到一个类对象中,不受外界的影响,比如:洗衣机就是对洗衣服功能,甩干功能,漂洗功能等的封装,其功能不会受到外界的微波炉影响。

          继承就是可以将类对象进行继承,派生类会继承基类的功能与属性,类似父与子的关系。比如水果和苹果,苹果就有水果的特性。

          接下来我们就来了解学习多态!

          2 什么是多态

          多态是面向对象技术(OOP)的核心思想,我们把具有继承关系的多个类型称为多态类型,通俗来讲:就是多种形态,具体点就是去完成某个行为,当不同的对象去完成时会产生出不同的状态。

          举个例子:就拿刚刚结束的五一假期买票热为例,买票这个行为,当普通人买票时,是全价买票;学生买票时,是半价买票;军人买票时是优先买票。同样一个行为在不同的对象上就有不同的显现。

          多态是在不同继承关系的类对象,去调用同一函数,产生了不同的行为。

          #include
          using namespace std;
          class Person 
          {
          public:
          	virtual void BuyTicket() { cout 
          public:
          	virtual void BuyTicket() { cout 
          	p.BuyTicket();
          }
          int main()
          {
          	Person p;
          	Student s;
          	//同一个函数对不同对象有不同效果
          	Func(p);
          	Func(s);
          	return 0;
          }
          };
          class B : public A {};
          //这里明显返回类型不同但是结构仍然正常
          class Person 
          {
          public:
          	virtual A* BuyTicket() { cout 
          public:
          	virtual B* BuyTicket() { cout 
          public:
          	~Person() { cout 
          public:
          	~Student() { cout 
          	Person p;
          	Student s;
          	return 0;
          }
          
          	//Person p;
          	//Student s;
          	//基类可以指向基类 也可以指向派生类的基类部分
          	Person* p1 = new Person ;
          	//通过切片来指向对应内容
          	Person* p2 = new Student;
          	delete p1;
          	delete p2;
          	return 0;
          }
          
          public:
          	~Person() { cout 
          public:
          	Student() { int* a = new int[100000000]; }
          	~Student() { cout 
          	for(int i = 0; i
微信扫一扫加客服

微信扫一扫加客服

点击启动AI问答
Draggable Icon