初识多态

一、什么是多态
顾名思义,多态就是一个事物多种形态;
在c++中,它的意思是支持相关的对象具有不同的成员函数(但原型相同),并允许对象与适当的成员函数进行运行时绑定。
多态性表现形式之一是:具有不同功能的函数可以用同一个函数名,这样就可以实现用一个函数名调用不同内容的函数;简单点说就是:“一个接口,多种方法”

二、多态的分类
分为静态多态和动态多态;静态多态的具体形式为函数重载和泛型编程,动态多态是通过虚函数实现的。

三、静态多态与动态多态的不同
静态多态:编译器根据函数实参的类型(可能会进行隐式类型转换),推断出要调用哪个函数,如果有对应的函数就调用那个函数,如果没有则编译不通过。(在编译期间完成
动态多态:也叫动态绑定,判断所引用对象的实际类型,根据实际类型调用相应的方法(在程序执行期间

四、实现动态多态条件:
(1)必须是虚函数,派生类需要重写;
(2)通过基类类型的引用或者指针调用虚函数。
下面举一个多态的例子~

class A
{
public:
    virtual void Print1()
    {
        cout<<"A::Print1()"<public A
{
public:
    virtual void  Print1()  
    {
        cout<<"B::Print1()"<//实现函数重写
    }
};
void Print1(A& a)//通过基类的引用访问
{
    a.Print1();
}
int main()
{
    A a,*pa,*pb;
    B b;
    pa = &a;
    pb = &b;
    a.Print1();//通过引用访问
    b.Print1();
    pa->Print1();//通过基类的指针访问
    pb->Print1();
    Print1(a);//通过引用访问
    Print1(b);
    system("pause");
    return 0;
}

运行结果分析对比:
初识多态_第1张图片

五、说明:
(1)虚函数:类的成员函数用virtual修饰的函数;(析构函数和协变除外,后面会具体介绍)
(2)在继承体系中同名函数的函数重写函数重载以及函数的重定义之间有什么区别呢?(简单总结如下)

初识多态_第2张图片
(3)四个“不能”
a.构造函数不能使用虚函数;
原因:构造函数本身的作用就是完成对对象的初始化,要知道对象的实际类型,而虚函数是在运行期间才确定实际类型的,那么就会导致编译器无法知道对象的具体类型,所以构造函数不能定义为为虚函数。
b. 缺省的函数不能使用虚函数;
c.类的静态成员函数不能定义为虚函数;
原因:如果定义为虚函数,那么它就是动态绑定的,也就是在派生类中可以被覆盖的,这与静态成员函数的定义本身就是相矛盾的。 ·······································
d.友元函数不能定义为虚函数;
那么虚函数在继承中是怎么发挥作用的呢~
(4)赋值运算符可以定义为虚函数,但是最好不要。

六、纯虚函数

class A
{
public:
    virtual void Print1()=0;//在成员函数的形参列表后面写上=0,就为纯虚函数
protected:
    int _a;

};
class B:public A
{};

包含纯虚函数的类叫做抽象类,也叫接口类,抽象类不能实例化出对象,纯虚函数在派生类中重新定义之后,派生类才能实例化出对象。

你可能感兴趣的:(c++,多态)