C++多态总结
多态是面向对象编程领域的核心概念之一,那么什么是多态呢?
多态一词最初来源于希腊语,意思是具有多种形式和多种形态的情形,在C++中是指同样的消息被不同的对象接受时导致不同的行为,这里的消息就是指对象的成员函数的调用,不同的行为指的是不同的实现。
多态性可以简单的概括为“一个接口,多个方法”,程序在运行时才决定调用哪个函数。
C++的多态是用虚函数来实现的,下面介绍一下虚函数:
虚函数
类的成员函数中被virtual关键字修饰的函数是虚函数。
class Person{
public:
void BuyTickets() {
cout << "买票 —— 全价" << endl;
}
protected:
int _id;
};
如上代码,类Person中的BuyTickets()函数就是一个虚函数,那么它有什么用,以及如何实现多态呢?我们先看一个概念
虚函数重写
当在子类中定义了一个与父类完全相同的虚函数时,则称子类的这个函数重写(覆盖)了父类的这个函数,举个栗子
class Person{
public:
virtual void BuyTickets() {
cout << "买票 —— 全价" << endl;
}
protected:
int _id;
};
class Student : public Person {
public:
virtual void BuyTickets() {
cout << "买票 —— 半价" << endl;
}
protected:
//学号
int _num;
};
Person类为基类,Student类为派生类,基类和派生类都具有虚函数BuyTickets,这时候就构成重写(覆盖),那么重写有什么作用?或者说它是如何支持多态的呢?
多态是,当虚函数重写时,使用基类的指针或引用调用重写的虚函数时,当指针指向父类时调用的就是父类的虚函数,指向子类时调用的就是子类的虚函数。
测试代码:
Student s;
Person* p2 = &s;
Person& p3 = s;
p2->BuyTickets();
p3.BuyTickets();
p2和p3虽然是父类对象的指针和引用,但是调用的却是子类对象的虚函数
这就是通过虚函数重写实现的多态,可以概括为,指向谁调用谁
纯虚函数
在普通的虚函数形参后面写上=0,则该虚函数为纯虚函数,包含纯虚函数的类叫做抽象类(也叫接口类)
纯虚函数是一种特殊的虚函数,在许多情况下,在基类中不能对虚函数给出有意义的实现,而把它声明为纯虚函数,它的实现留给该基类的派生类去做。
再来举个栗子: