十三、C++复习——多态
1 基本概念
概念: 通俗来说,多态就是多种状态,父子对象完成相同任务会产生不同的结果。
比如:
学生和普通人都去买门票学生是半价,而普通人是全价
在继承中构成多态要有两个条件:
-
必须通过基类的指针
-
调用的函数必须是虚函数,并且子类的虚函数要被重写
1.1 虚函数的概念
基类中声明为virtual并在一个或多个派生类中重新定义的成员函数叫做虚函数。
关键字virtual加在成员函数前,这个成员函数就是虚函数!
1.2 虚函数的核心作用
-
实现动态联编,在函数运行阶段动态的选择合适的成员函数。
-
在定义了虚函数后,可实现在派生类中对虚函数进行重写,从而实现统一的接口和不同的执行过程。
1.3 示例
2 多态的实现原理
3 纯虚函数和抽象类
纯虚函数是一个在基类中说明的虚函数,在基类中没有定义,要求任何派送类都定义自己的版本。
纯虚函数为个派生类提供一个公共界面(接口的封装和设计、软件的模 块功能划分)
4 虚析构函数
多继承对象创建的时候,先调用父类的构造函数,再调用子类的构造函数。所以不能有虚构造函数,因为虚构造函数,会直接调用子类的构造函数,而不调用父类的构造函数。
虚析构函数,父类指针指向子类的时候,释放父类指针,就可以调用子类的析构函数释放内存,然后再调用父类的析构函数释放内存。
5 构成多态的两个特列
特例一:子类的虚函数不写virtual,依旧构成多态
class Person {
public:
virtual void BuyTicket() { cout << "买票-全价" << endl; }
};
class Student : public Person {
public:
void BuyTicket() { cout << "买票-半价" << endl; }
};
Person* p1 = new Person;
Person* p2 = new Student;
p1->BuyTicket();
p2->BuyTicket();
特例二:基类与派生类虚函数返回值类型不同,也可以构成多态(返回值必须满足某种条件)
class A{};
class B : public A {};
class Person {
public:
virtual A* f() {return new A;}
};
class Student : public Person {
public:
virtual B* f() {return new B;}
};