C++基础——多态

1.对象类型

1、静态类型,编译时确定
2、动态类型,运行时确定
==如 Human xiaoming=new Man();==
xiaoming的静态类型为Human,动态类型为Man
多态即基于此来实现

2.协变与抗变

所谓的协变,可以理解成:==父类的对象用子类替换==,也可以理解成子类当父类用。
所谓的抗变,可以理解成:==子类的对象用父类替换==,也可以理解成父类当子类用。抗变也常常翻译为逆变。

==C++默认有协变转换,即父类对象可用子类对象替换。==

3.多态

3.1运行时多态:重写/覆盖

1.作用域:子类+父类
2.派生类重写的函数与基类中被重写的函数必须都是virtual函数,当然子类中的函数重写不必显式声明virtual虚函数。
3.返回类型+函数名+参数 相同
注意:
1.子类中的函数与父类中的同名函数具有相同的参数和返回值类型时,但如果一个是const函数(non-mutable)、一个是非const函数(mutable),不构成函数重写。
2.重写的函数所抛出的异常必须和被重写的函数抛出的异常一致,或者是其子类
3.重写的函数的访问修饰符可以不同于被重写的函数,如基类中被重写的函数访问修饰符为private,派生类中重写的函数的访问修饰符可以为public或protected。
4.静态方法不能被重写,因为static与virtual不能同时被使用。
5.子类中重写的函数virtual关键字可以加也可以不加, 本质上都是虚函数的属性,只要与基类中的相关函数构成重写关系。

3.2编译时多态:重载

1.同一可访问区内
2.具有不同参数列(参数的类型,个数,顺序不同)的同名函数,根据参数列表确定调用哪个函数,重载不关心函数返回类型。

3.3多态特例:返回类型协变

与重写的函数差别:
返回指针/引用,子类中重写的函数返回的指针/引用是父类中被重写函数所返回指针/引用的子类型

//协变,也可以构成重写(覆盖),但返回值是该类类型的指针或引用  
class Base     
{         
    virtual Base * FunTest()    
    {    
        //do something    
    }    
};    
class Derived : public Base    
{    
    Derived * FunTest()    
    {    
        //do something    
    }    
};

4.隐藏

1.父类+子类
2.在函数名相同情况下,非多态三种情况

5.总结

1.多态情况下,按照动态类型的函数运行
2.隐藏情况下,按照静态类型的函数运行
3.基类中定义了虚函数,在派生类中该函数始终保持虚函数的特性
4.虚表是所有类对象实例共用的

你可能感兴趣的:(C++基础——多态)