您的位置:首页 > 编程语言 > C语言/C++

关于C++虚表和虚指针

2012-04-15 00:41 225 查看
以下为个人的一些理解,如有不对,敬请大家斧正。
class base
{
public:
virtual void act()
{
cout << "act_B" << endl;
}
virtual void fun()
{
cout << "fun_B" << endl;
}
};
class derive: base
{
public:
virtual void fun()
{
cout << "fun_D" << endl;
}
virtual void act()
{
cout << "act_D" << endl;
}
};
虚表是C++用于实现多态的一种方式,每个拥有虚函数的类编译器都会为之分配一张虚表,指向虚表的指针即为虚指针,例如以上两个类base和device,分别就有一张虚表,包含有两个函数fun()和act()。
int main()
{
derive dd;

base bs;

base *ptr_b;

ptr_b = &bs;

int **ptr = (int **) ptr_b; //指向基类对象bs

cout << "Addr. of object bs:" << ptr << endl;

cout << "Addr. of base::VTABLE: " << *ptr << endl;

cout << "Indexing of virtual function bs.act( ):"

<< "0x00" << hex << **ptr << endl;

cout << "Indexing of virtual function bs.fun( ):"

<< "0x00" << *(*ptr + 1) << endl;

ptr++; //指向派生类对象dd

cout << "Addr. of object dd:" << ptr << endl;

cout << "Addr. of derive::VTABLE:" << *ptr << endl;

cout << "Indexing of virtual function dd.act( ):"

<< "0x00" << hex << **ptr << endl;

cout << "Indexing of virtual function dd.fun( ):"

<< "0x00" << *(*ptr + 1) << endl;
return 0;
}
由以上例子看出,虚指针存储在对象空间中,由虚指针可以找到虚表,在由虚函数的排列顺序就可以找到每个函数的地址,我当前为高位先存,所以fun()地址比act()大,并且由于内存逻辑上是连续分配的,所以ptr++就可以得到子类对象的地址。
运行结果大家可以到文章用图里找。
参考:
http://wenku.baidu.com/view/a4ca7783e53a580216fcfedf.html
http://page.renren.com/601284443/note/819878679?&ref=share

                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: