C++继承(四)对象模型

来源:互联网 发布:nero10刻录软件怎么用 编辑:程序博客网 时间:2024/06/06 09:26

*虚函数表:虚函数表是通过一块连续的内存来存储虚函数的地址
下面是一段程序

class A{public:    virtual void fun1()    {}    virtual void fun2()    {}private:    int a;};void test(){    A s;}int main(){    test();    system("pause");    return 0;}

虚函数表:
这里写图片描述

探究单继承对象模型

class A{public:    virtual void fun1()    {        cout << "A::fun1()" << endl;    }    virtual void fun2()    {        cout << "A::fun2()" << endl;    }private:    int a;};class B :public A{public:    virtual void fun1()    {        cout << "B::fun1()" << endl;    }    virtual void fun3()    {        cout << "B::fun3()" << endl;    }    virtual void fun4()    {        cout << "B::fun4()" << endl;    }private:    int b;};void test(){    A aa;    B bb;}int main(){    test();    system("pause");    return 0;}

这里写图片描述

上图中子类B::fun1重写了父类A::fun1,覆盖了相应虚表位置上的函数。这里并没有看到子类中的fun3和fun4,实际上这两个函数就存放在fun2的后面,只是 编译器没有显示,这是编译器的一个bug(所采用的编译器为vs2013)

*多继承(菱形继承)的内存布局

#include<iostream>using namespace std;class A{public:    virtual void fun1()    {        cout << "A::fun1()" << endl;    }    virtual void fun2()    {        cout << "A::fun2()" << endl;    }private:    int a;};class B{public:    virtual void fun1()    {        cout << "B::fun1()" << endl;    }    virtual void fun2()    {        cout << "B::fun3()" << endl;    }private:    int b;};class C:public A ,public B{public:    virtual void fun1()    {        cout << "C::fun1()" << endl;    }    virtual void fun3()    {        cout << "C::fun3()" << endl;    }private:    int c;};void test(){    A aa;    B bb;     C cc;}int main(){    test();    system("pause");    return 0;}

代码分析见下面的图中
这里写图片描述

0 0
原创粉丝点击