关于C++虚表和虚指针

来源:互联网 发布:铝塑板开槽尺寸算法 编辑:程序博客网 时间:2024/06/10 18:28
以下为个人的一些理解,如有不对,敬请大家斧正。
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
	
				
		
原创粉丝点击