C++ 多态(2) 一、覆盖(重写)、重载、隐藏1.成员函数覆盖(override ,也称重写)特点:①不同的作用域(分别位于派生类与基类);②函数名相同;③参数相同;④返回值相同;⑤基类必须有virtual 关键字,不能有static;⑥重写函数的权限访问限定符可以不同; 2.成员函数隐藏 特点:①基类与派生类有同名函数,调用的时候总是调用子类的函数,此时父类成员函数被隐藏;②不在同一作用域(分别位于派生类与基类);③函数名相同;④返回值可相同可不同;⑤参数不同时,不论有无virtual关键字,基类函数将被隐藏(注意与重载的区别);⑥参数相同时,但基类没有virtual关键字,基类的函数被隐藏(注意与覆盖的区别); 3.函数重载(overload)特点:①同一片作用域内;②函数名相同;③返回值可以相同可以不相同;④参数列表不同; 4.重写与隐藏的区别:①对于子类对象来说,子类对象在调用的时候,总是调用子类实现的成员函数;②对于父类对象,重写:用父类的指针或引用指向子类对象的时候,覆盖的情况下,父类指针或引用调用的函数是子类实现的函数;隐藏:用父类的指针或引用指向子类对象的时候,隐藏的情况下,父类指针或引用调用的函数是父类实现的函数; 二、多态原理与虚函数表1.虚函数表:实际上对于定义了虚函数的类来说,有一个隐藏的虚函数表指针,指向一个虚函数表,这个虚函数表中存放着虚函数的地址;2.多态原理:由于动态绑定,因此当父类的指针或者引用去调用虚函数时,会到运行时具体的对象的虚函数表中进行寻找对应的虚函数进行调用,若为父类类型,则调用父类虚函数,若为派生类类型,则调用派生类虚函数; 三、抽象类与纯虚函数1.什么叫抽象类?含纯虚函数的类称为抽象类。 2.什么叫纯虚函数?指定函数接口规范,而不做具体的实现,实现部分由继承它的子类去实现。(只定义,不实现) 3.抽象类的特点与作用①抽象类中只声明函数接口,不能有具体的实现;②抽象类不能创建对象,可以定义指针与引用;③派生类继承基类,并且必须要实现基类中的所有纯虚函数,否则派生类也是抽象类; 4.应用场景①某些情况下父类只知道其子类应该包含怎样的方法,但无法准确知道子类如何实现这些方法。此时我们会在父类中只声明相应的方法,而不去具体实现,让子类根据自己实际情况去实现相应的方法。②从多个具有相同特征的类中抽象出一个抽象类,以这个抽象类作为子类的模板,避免子类设计随意性; 一、覆盖(重写)、重载、隐藏 1.成员函数覆盖(override ,也称重写)特点: ①不同的作用域(分别位于派生类与基类); ②函数名相同; ③参数相同; ④返回值相同; ⑤基类必须有virtual 关键字,不能有static; ⑥重写函数的权限访问限定符可以不同; 2.成员函数隐藏 特点: ①基类与派生类有同名函数,调用的时候总是调用子类的函数,此时父类成员函数被隐藏; ②不在同一作用域(分别位于派生类与基类); ③函数名相同; ④返回值可相同可不同; ⑤参数不同时,不论有无virtual关键字,基类函数将被隐藏(注意与重载的区别); ⑥参数相同时,但基类没有virtual关键字,基类的函数被隐藏(注意与覆盖的区别); 3.函数重载(overload)特点: ①同一片作用域内; ②函数名相同; ③返回值可以相同可以不相同; ④参数列表不同; 4.重写与隐藏的区别: ①对于子类对象来说,子类对象在调用的时候,总是调用子类实现的成员函数; ②对于父类对象,重写:用父类的指针或引用指向子类对象的时候,覆盖的情况下,父类指针或引用调用的函数是子类实现的函数; 隐藏:用父类的指针或引用指向子类对象的时候,隐藏的情况下,父类指针或引用调用的函数是父类实现的函数; 二、多态原理与虚函数表 1.虚函数表:实际上对于定义了虚函数的类来说,有一个隐藏的虚函数表指针,指向一个虚函数表,这个虚函数表中存放着虚函数的地址; 2.多态原理:由于动态绑定,因此当父类的指针或者引用去调用虚函数时,会到运行时具体的对象的虚函数表中进行寻找对应的虚函数进行调用,若为父类类型,则调用父类虚函数,若为派生类类型,则调用派生类虚函数; 三、抽象类与纯虚函数 1.什么叫抽象类? 含纯虚函数的类称为抽象类。 2.什么叫纯虚函数? 指定函数接口规范,而不做具体的实现,实现部分由继承它的子类去实现。(只定义,不实现) 3.抽象类的特点与作用 ①抽象类中只声明函数接口,不能有具体的实现; ②抽象类不能创建对象,可以定义指针与引用; ③派生类继承基类,并且必须要实现基类中的所有纯虚函数,否则派生类也是抽象类; 4.应用场景 ①某些情况下父类只知道其子类应该包含怎样的方法,但无法准确知道子类如何实现这些方法。此时我们会在父类中只声明相应的方法,而不去具体实现,让子类根据自己实际情况去实现相应的方法。 ②从多个具有相同特征的类中抽象出一个抽象类,以这个抽象类作为子类的模板,避免子类设计随意性;