【C++】多态及其对象模型

来源:互联网 发布:男士 爽肤水 知乎 编辑:程序博客网 时间:2024/06/06 01:09

多态
多态是面向对象程序设计的重要特征之一,在C++中多态可以这样定义:同一操作作用于不同类的实例,将产生不同的执行结果。也就是说,不同的类的对象收到相同的消息时,得到不同的结果。
这里写图片描述
【**多态的对象模型】–单继承&多继承
虚表剖析
虚表是通过一块连续内存来存储虚函数的地址。
这里写图片描述

单继承
首先我们先写一个可以打印虚表的函数

//该函数只能在32位平台下打印虚表typedef void(*V_FUNC)();  //定义一个无参返回值为空的函数指针V_FUNvoid PrintVtable(int* vtable){    int* vArray =(int*) vtable;    printf("vtable:0x%p\n", vArray);    for (size_t i = 0; vArray[i] != 0; i++)    //在vs下虚表结束的标志是=0    {        printf("vtable[%d]:.0x%x->", i, vArray[i]);        V_FUNC f = (V_FUNC)vArray[i];        f();    }    cout << endl;}下面函数在32位/64位平台都适用typedef void(*V_FUNC)();  void PrintVtable(void* vtable){    printf("vtable:0x%p\n", vtable);    V_FUNC* vArray =(V_FUNC*) vtable;    for (size_t i = 0; vArray[i] != 0; i++)    {        printf("vtable[%d]:.0x%x->", i, vArray[i]);        vArray[i]();    }    cout << endl;}

这里写图片描述
多继承
这里写图片描述
多态的对象模型–菱形继承和菱形虚拟继承
菱形继承

class A{public:    virtual void fun1()    {        cout << "A::fun1()" << endl;    }    virtual void fun2()    {        cout << "A::fun2()" << endl;    }public:    int _a;};class B:public A{public:    virtual void fun1()    {        cout << "B::fun1()" << endl;    }    virtual void fun3()    {        cout << "B::fun3()" << endl;    }public:    int _b;};class C:public A{public:    virtual void fun1()    {        cout << "C::fun1()" << endl;    }    virtual void fun3()    {        cout << "C::fun3()" << endl;    }public:    int _c;};class D :public B,public C{public:    virtual void fun1()    {        cout << "C::fun1()" << endl;    }    virtual void fun5()    {        cout << "C::fun4()" << endl;    }public:    int _d;};

这里写图片描述
菱形虚继承

class A{public:    virtual void fun1()    {        cout << "A::fun1()" << endl;    }    virtual void fun2()    {        cout << "A::fun2()" << endl;    }public:    int _a;};class B:virtual public A{public:    virtual void fun1()    {        cout << "B::fun1()" << endl;    }    virtual void fun3()    {        cout << "B::fun3()" << endl;    }public:    int _b;};class C:virtual public A{public:    virtual void fun1()    {        cout << "C::fun1()" << endl;    }    virtual void fun3()    {        cout << "C::fun3()" << endl;    }public:    int _c;};class D : public B, public C{public:    virtual void fun1()    {        cout << "C::fun1()" << endl;    }    virtual void fun5()    {        cout << "C::fun4()" << endl;    }public:    int _d;};

这里写图片描述

原创粉丝点击