剖析C++对象模型

来源:互联网 发布:如何删除知乎提问 编辑:程序博客网 时间:2024/05/22 04:33

多态:就是指多种形态

C++中虚函数的主要作用就是实现多态, 简单说父类的指针/引用调用重写的虚函数,当父类指针/引用指向父类对象调用的是父类的虚函数,指向子类对象时调用的是子类的虚函数。





<span style="font-size:24px;"><span style="font-size:24px;">#include<iostream>using namespace std;class Base{public:<span style="white-space:pre"></span>virtual void func1()<span style="white-space:pre"></span>{<span style="white-space:pre"></span>cout << "Base::func1" << endl;<span style="white-space:pre"></span>}<span style="white-space:pre"></span>virtual void func2()<span style="white-space:pre"></span>{<span style="white-space:pre"></span>cout << "Base::func2" << endl;<span style="white-space:pre"></span>}private:<span style="white-space:pre"></span>int a;};class Derive :public Base{public:<span style="white-space:pre"></span>virtual void func1()<span style="white-space:pre"></span>{<span style="white-space:pre"></span>cout << "Derive::func1" << endl;<span style="white-space:pre"></span>}<span style="white-space:pre"></span>virtual void func3()<span style="white-space:pre"></span>{<span style="white-space:pre"></span>cout << "Derive::func3" << endl;<span style="white-space:pre"></span>}<span style="white-space:pre"></span>virtual void func4()<span style="white-space:pre"></span>{<span style="white-space:pre"></span>cout << "Derive::func4" << endl;<span style="white-space:pre"></span>}private:<span style="white-space:pre"></span>int b;};int main(){Base b;Deverse d;system("pause");return 0;}</span></span>



Base模型分析:

Base实例化的对象b, 通过监视窗口我们可以看到,b中不仅有成员变量_a ,还有__vfptr,它就是虚表指针,虚表指针中下标为0的指向Base::fun1()  ,下标为1的指向Base::fun2()


Derive模型分析:

Derive实例化对象d,他继承了Base类,所以可以看到不仅有数据_a还有数据_b,但是在虚函数指针中只显示了两个,按照继承规则,在d中应该有重写了Base的

Derive::fun1, 来自基类的Base::fun2  ,还有Derive::fun3, Derive::fun4

但是没有显示出来,这应该是vs的一个bug;

不过我们可以通过以下方式将他们打印出来:

<span style="font-size:24px;">typedef void (* FUNC) ();void PrintVTable (int* VTable){     cout<<" 虚表地址>"<< VTable<<endl ;     for (int i = 0; VTable[i ] != 0; ++i)    {          printf(" 第%d个虚函数地址 :0X%x,->", i , VTable[i ]);          FUNC f = (FUNC) VTable[i ];          f();    }     cout<<endl ;}</span>


这样就可以显示出来了。

1 0
原创粉丝点击