【C++ 第十一章】多态

前言

        需要声明的,本节课件中的代码及解释都是在 vs2019 下的x86程序中,涉及的指针都是4bytes 。如果要其他平台下,部分代码需要改动。比如:如果是x64程序,则需要考虑指针是8bytes 问题等等

1. 多态的概念

1.1 概念

多态的概念:通俗来说,就是多种形态,具体点就是去完成某个行为,当不同的对象去完成时会产生出不同的状态。

【C++ 第十一章】多态_第1张图片

举个栗子:比如买票这个行为,当普通人买票时,是全价买票;学生买票时,是半价买票;军人买票时是优先买票。

再举个栗子:         

        最近为了争夺在线支付市场,支付宝年底经常会做诱人的扫红包-支付-给奖励金的活动。那么大家想想为什么有人扫的红包又大又新鲜8块、10块...,而有人扫的红包都是1毛,5毛....。其实这背后也是一个多态行为。支付宝首先会分析你的账户数据,比如你是新用户、比如你没有经常支付宝支付等等,那么你需要被鼓励使用支付宝,那么就你扫码金额 = random()%99;比如你经常使用支付宝支付或者支付宝账户中常年没钱,那么就不需要太鼓励你去使用支付宝,那么就你扫码金额 = random()%1;总结一下:同样是扫码动作,不同的用户扫得到的不一样的红包,这也是一种多态行为。ps:支付宝红包问题纯属瞎编,大家仅供娱乐。

2. 多态的定义及实现

2.1多态的构成条件

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

比如 Student 继承了 Person 。Person 对象买票全价,Student 对象买票半价。

那么在继承中要构成多态还有两个条件:

1. 必须通过基类的指针或者引用调用虚函数

2. 被调用的函数必须是虚函数,且派生类必须对基类的虚函数进行重写

【C++ 第十一章】多态_第2张图片

2.2 虚函数

虚函数:即被 virtual 修饰的类成员函数称为虚函数。

virtual 只能用来修饰非静态的成员函数(即 全局函数和静态函数都不行)

class Person {
public:    
    virtual void BuyTicket() { 
        cout << "买票-全价" << endl;
    }
};

2.3虚函数的重写

虚函数的重写(覆盖):派生类中有一个跟基类完全相同的虚函数(即派生类虚函数与基类虚函数的返回值类型、函数名字、参数列表完全相同),称子类的虚函数重写了基类的虚函数。

如果没有加 virtual 标识,则子类和父类相同的成员 叫做隐藏

class Person 
{ 
public:    
	virtual void BuyTicket() { 
		cout << "买票-全价" << endl; 
	} 
};
class Student : public Person
{
public:
	virtual void BuyTicket() {
		cout << "买票-半价" << endl;
	}
};

void Func(Person& p) {
	p.BuyTicket();
}

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

注意:在重写基类虚函数时,派生类的虚函数在不加virtual关键字时,虽然也可以构成重写(因为继承后基类的虚函数被继承下来了在派生类依旧保持虚函数属性),但是该种写法不是很规范,不建议这样使用这样使用

这个意思是:子类不写 virtual 可以,父类不写 virtual 不行。后面讲的派生类的析构可以不加virtual,但是建议加上,别乱搞doge

2.3.1 虚函数重写的两个例外:

1. 协变(基类与派生类虚函数返回值类型不同)

        派生类重写基类虚函数时,与基类虚函数返回值类型不同。即基类虚函数返回基类对象的指针或者引用,派生类虚函 数返回派生类对象的指针或者引用时,称为协变。(了解)

        返回值类型可以写什么?:只要是构成父子类的都行,是 Person 和 Studen

你可能感兴趣的:(C++修炼之路,c++,开发语言)