目录
1.多态的概念
1.1什么是多态?
多态是在不同继承关系的类对象,去调用同一函数,产生了不同的行为。
简单的说:就是”一个接口多种实现“。
1.2为什么要用多态呢?
我们知道,封装可以隐藏实现细节,使得代码模块化;继承可以扩展已存在的代码模块(类);它们的目的都是为了代码重用。而多态除了代码的复用性外,还可以解决项目中紧偶合的问题,提高程序的可扩展性.。耦合度讲的是模块与模块之间,代码与代码之间的关联度,通过对系统的分析把他分解成一个个的子模块,子模块提供稳定的接口,达到降低系统耦合度的的目的,模块与模块之间尽量使用模块接口访问,而不是随意引用其他模块的成员变量。
1.3多态有什么好处?
- 应用程序不必为每一个派生类编写功能调用,只需要对抽象基类进行处理即可。大大提高程序的可复用性。//继承
- 派生类的功能可以被基类的方法或引用变量所调用,这叫向后兼容,可以提高可扩充性和可维护性。 //多态的真正作用,
2.多态的定义及实现
2.1继承中构成多态的条件
- 必须通过基类的指针或者引用调用虚函数
- 被调用的函数必须是虚函数,且派生类必须对基类的虚函数进行重写
2.2虚函数
虚函数:即被virtual修饰的类成员函数称为虚函数。
class Person {
public:
virtual void BuyTicket() {
cout << "买票-全价" << endl;}
};
2.3虚函数的重写
虚函数的重写(覆盖):派生类中有一个跟基类完全相同的虚函数(即派生类虚函数与基类虚函数的返回值类型、函数名字、参数列表完全相同),称派生类的虚函数重写了基类的虚函数。
//void BuyTicket (),返回值类型、函数名字、参数列表完全相同
class Person {
public:
virtual void BuyTicket() {
cout << "买票-全价" << endl; }
};
class Student : public Person {
public:
virtual void BuyTicket() {
cout << "买票-半价" << endl; }
/*注意:在重写基类虚函数时,派生类的虚函数在不加virtual关键字时,虽然也可以构成重写(因为继承后
基类的虚函数被继承下来了在派生类依旧保持虚函数属性),但是该种写法不是很规范,不建议这样使用*/
/*void BuyTicket() { cout << "买票-半价" << endl; }*/
};
虚函数重写的两个例外:
- 协变(基类与派生类虚函数返回值类型不同)
派生类重写基类虚函数时,与基类虚函数返回值类型不同。即基类虚函数返回基类对象的指针或者引用,派生类虚函数返回派生类对象的指针或者引用时,称为协变。
class Person {
public:
virtual A* f() {
return new A;} //基类的返回值为A*
};
class