菜鸟笔记
提升您的技术认知

多态的概念

多态的概念

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

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

多态的定义及实现

1.多态定义的构成条件

多态是在不同继承关系的类对象,去调用同一函数,产生了不同的行为。比如Student继承了Person。 Person对象买票全价,Student对象买票半价。

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

  1. 调用函数的对象必须是指针或者引用
  2. 被调用的函数必须是虚函数,且完成了虚函数的重写

这里提到的虚函数是什么呢?

虚函数:就是在类的成员函数的前面加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();
}

析构函数的重写问题:

基类中的析构函数如果是虚函数,那么派生类的析构函数就重写了基类的析构函数。这里他们的函数名不相同,看起来违背了重写的规则,其实不然,,这里可以理解为编译器对析构函数的名称做了特殊处理,编译后
析构函数的名称统一处理成destructor,这也说明的基类的析构函数最好写成虚函数

class Person 
{  
public:
    virtual ~Person() 
    { 
        cout << "~Person()" << endl;
    } 
};
 
class Student : public Person 
{ 
 public:
     virtual ~Student() 
     { 
         cout << "~Student()" << endl; 
     } 
};
 
// 只有派生类Student的析构函数重写了Person的析构函数,下面的delete对象调用析构函数,才能构成多 态,才能保证p1和p2指向的对象正确的调用析构函数。 
int main() 
{ 
    Person* p1 = new Person;    
    Person* p2 = new Student;
 
    delete p1;    
    delete p2;
 
    return 0; 
}

重载、覆盖(重写)、隐藏(重定义)的对比

  1. 重定义:子类和父类中有同名成员,子类成员将屏蔽父类对同名成员的直接访问,这种情况叫隐藏,也叫重定 义。(在子类成员函数中,可以使用 基类::基类成员 显示访问)
  2. 重写:派生类中有一个跟基类的完全相同虚函数,我们就称子类的虚函数重写了基类的虚函数,完全相同是指:函数名、参数、返回值都相同。另外虚函数的重写也叫作虚函数的覆盖