C++ ------>多态__01
  L8iEHH07GzZb 2023年11月19日 38 0

各位好友, 本期__正式进入  --->继承下多态 下面进入开战 环节 !

-------->多态 :>不同的对象, 进行某些行为的时候, 会产生不一样的状态

如 , 购买火车票, 学生可以购买到 优惠的火车票(含折扣)而 普通人 只能购买到 全价票

-------->代码实现 :>

//多态展现
//
#include <iostream>

using std :: cout;
using std :: endl;

class Person
{
public:
  virtual void _BuyTickuet() const {cout << "全价火车票" << endl;}  
};

class Student : public Person
{
public:
	virtual void _BuyTicket() const {cout << "半价位火车票" << endl;}
};

void Func(const Person& p)
{
	p._BuyTicket();
}

int main()
{
 	Func(Person());
  
  Func(Student());
	return 0;
}

为了方便好友们, 有更好的观感体验, 现附上 彩色 代码图样 :>

--------->NO 1.

C++ ------>多态__01_析构推演

--------->上述代码,不加上 “ Virtual ” 就只是 普通调用即,对象是什么就会去调用什么


--------->NO 2.

C++ ------>多态__01_析构推演_02


------->解析环节 :>

C++ ------>多态__01_析构函数重写_03


(1). 上述代码 P 发生了切片行为 从而可以指向 基类 ~~ 派生类

(2). 注意 :>

----->多态 不同对象传递过去 会去调用不同的函数

----->多态调用/看__指向当前的对象 而 普通对象 只看__当前的类型

(3). 多态条件 :>

a . 调用函数是重写的虚函数  b . 必须是 基类的指针 或者 引用

--------->探究__多态条件 :>

--------->NO a.

//探究多态条件
//基类成员函数 不再是 虚函数
class person
{
public:
  void _BuyTiucket() const {cout << "全价火车票" << endl;}
};

class Student
{
public:
  virtual void _BuyTicket() const {cout << "半价火车票" << endl;}
};

void Func(const Person& p)
{
	p._BuyTicket();
}

int main()
{
  Func(Person());
  
  Func(Student());
	return 0;
}



--------->NO b.

//探究多态条件
//
class person
{
public:
  virtual void _BuyTiucket() const {cout << "全价火车票" << endl;}
};

class Student
{
public:
  virtual void _BuyTicket() const {cout << "半价火车票" << endl;}
};

void Func(const Person p)
{
	p._BuyTicket();
}

int main()
{
  Func(Person());
  
  Func(Student());
	return 0;
}

为了方便好友们, 有更好的观感体验, 现附上 彩色 代码图样 :>

------->NO a.

C++ ------>多态__01_浅尝__协变_04



------->NO b .

C++ ------>多态__01_析构函数重写_05


各位好友, 上述推演过程 ,还涉及 虚函数的重写 !下面展现 重写相关知识 :>

(1). 虚函数重写(覆盖)派生类中有一个跟基类完全相同的虚函数, 即, 符合 三同

------->函数名相同, 参数列表相同 , 返回值相同 (大前提条件)

------->NO 1.

C++ ------>多态__01_多态_06



------->NO 2.

C++ ------>多态__01_析构推演_07


(2). 虚函数重写  --->两个例外 :>

a . 协变(基类 ~~ 派生类  --->返回值类型可以不相同)

派生类重写虚函数/时候, 与基类虚函数返回值类型可以不同 即,基类虚函数返回基类对象的指针 ~~ 引用

派生类虚函数返回派生类对象的指针 ~~ 引用 , 称其为 协变

------->NO 1.

C++ ------>多态__01_析构函数重写_08



------->NO 2.

C++ ------>多态__01_析构函数重写_09



------->NO 3.

C++ ------>多态__01_析构函数重写_10



-------->错误示例 :>

C++ ------>多态__01_析构推演_11



b . 析构函数重写(基类 ~~ 派生类  --->析构函数名字不同)

如果基类的析构函数为虚函数派生类的析构函数即使名字不一样也无论是否添加上 “Virtual”关键字

都可与基类的析构函数构成重写其实, 在底层汇编方面编译器对析构函数名称做了特殊处理编译之后

析构函数统一处理成 “Destructor” 。

-------->代码演示 :>

-------->NO 1.

//析构推演
//
#include <iostream>

using std :: cout;
using std :: endl;

class Person
{
public:
  virtual void _BuyTicket() {cout << "全价火车票" << endl;}
  
  ~Person() {cout << "~Person()" << endl;}
};

class Student : public Person
{
public:
	virtual void _BuyTicket() {cout << "半价火车票" << endl;}
  
  ~Student()
  {
  	cout << "~Student()" << endl << endl;
    
    delete _ptr;
  }
protected:
	int* _ptr;
};

void Func(const Person& p)
{
	p._BuyTicket();
}

int main()
{
  Func(Student());
  
  Func(Person());
	return 0;
}



-------->NO a.

C++ ------>多态__01_析构推演_12



-------->NO 2.

//析构推演
//
#include <iostream>

using std :: cout;
using std :: endl;

class Person
{
public:
  virtual void _BuyTicket() {cout << "全价火车票" << endl;}
  
  ~Person() {cout << "~Person()" << endl;}
};

class Student : public Person
{
public:
	virtual void _BuyTicket() {cout << "半价火车票" << endl;}
  
  ~Student()
  {
  	cout << "~Student()" << endl << endl;
    
    delete _ptr;
  }
protected:
	int* _ptr;
};

void Func(const Person& p)
{
	p._BuyTicket();
}

int main()
{
  Func(Student());
  
  Func(Person());
	return 0;
}



-------->NO b.

C++ ------>多态__01_析构推演_13


-------->解析环节 :>

-------->反汇编 :>

C++ ------>多态__01_虚函数重写_14



---------->多态下 析构推演 :>

C++ ------>多态__01_析构函数重写_15



-------->解析环节 :>

C++ ------>多态__01_析构推演_16


各位好友, 本期内容 已完结 !

下一期继续推进继承下 多态 敬请期待 😊😊


【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月19日 0

暂无评论

推荐阅读
  2YZIZtimO8DP   2023年12月22日   42   0   0 Java多态Java多态
  lo3R5ihTjlK9   2023年12月05日   16   0   0 父类父类Java多态Java多态
L8iEHH07GzZb