初识多态
父类被不同子类继承后,父类呈现出不同的状态
假设有人这个类,这个类的状态是工作。当人被学生类继承后,人这个类的状态就变成了学习。当人被程序员类继承后,人这个类的状态就变成了写代码。当人被厨师类继承后,人这个类的状态就变成了做饭。
多态的条件
必须通过父类的指针或者引用调用虚函数
被调用的函数必须是虚函数,且子类必须对父类的虚函数进行重写
虚函数
被 virtual 修饰的类 成员函数 称为虚函数
class Person { public: virtual void BuyTicket() { cout << "工作" << endl;} };
虚函数重写
子类中有一个跟父类完全相同的虚函数 ( 即子类虚函数与父类虚函数的 返回值类型、函数名字、参数列表完全相同 ) ,称子类的虚函数重写了父类的虚函数。
. 协变 ( 基类与派生类虚函数返回值类型不同 )
派生类重写父类虚函数时,与父类虚函数 返回值类型 不同。即父类虚函数返回父类对象的指
针或者引用,子类虚函数返回子类对象的指针或者引用时,称为协变。
如下是协变示例代码
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;} };
重写是用子类函数的实现把父类函数的实现覆盖掉
完成重写后,再去调用子类中父类的虚函数时,不再是父类原来的虚函数
如下是多态代码示例