• 欢迎浏览“String me = Creater\忠实的资深Linux玩家;”,请文明浏览,理性发言,有侵犯你的权益请邮件我(creater@vip.qq.com).
  • 把任何的失败都当作一次尝试,不要自卑;把所有的成功都想成是一种幸运,不要自傲。
  •    6年前 (2013-04-17)  C++ |   2 条评论  11 
    文章评分 0 次,平均分 0.0

    在上一篇里的《C++虚函数表》里说了单个类对象的虚函数布局,但是如果涉及到继承,情况会有不同。下面针对一般继承,一般继承就是o_vtable2

    说:基类有虚函数,但是子类并没有重载这些基类的虚函数,而是重新定义自己的虚函数。如图所示。

    这种情况下,派生类自己的虚函数表既包含了基类的函数指针,也包含了派生类自己的函数指针。怎么分布,看下面的解析。

     

     

     

     

    代码如下所示:

    #include <iostream>
    #include <algorithm>
    using namespace std;
    class Base
    {
    public:
    	virtual void f() { cout << "Base::f" << endl; }
    	virtual void g() { cout << "Base::g" << endl; }
    	virtual void h() { cout << "Base::h" << endl; }
    };
    class Derived:public Base
    {
    public:
    	virtual void fd() { cout << "Derived::fd" << endl; }
    	virtual void gd() { cout << "Derived::gd" << endl; }
    	virtual void hd() { cout << "Derived::hd" << endl; }
    };
    
    int main()
    {
    	typedef void(*Fun)(void);
    	Derived b;
    	Fun pFunc = NULL;
    	cout<<"虚函数表地址"<<(int*)(&b)<<endl;
    	cout<<"虚函数表中第1个函数地址"<<(int*)*(int*)(&b)<<endl;
    	cout<<"虚函数表中第2个函数地址"<<((int*)*(int*)(&b)) + 1<<endl;
    	cout<<"虚函数表中第3个函数地址"<<((int*)*(int*)(&b)) + 2<<endl;
    	pFunc = (Fun)*((int*)*(int*)(&b));
    	pFunc();
    	pFunc = (Fun)*((int*)*(int*)(&b) + 1);
    	pFunc();
    	pFunc = (Fun)*((int*)*(int*)(&b) + 2);
    	pFunc();
    	pFunc = (Fun)*((int*)*(int*)(&b) + 3);
    	pFunc();
    	pFunc = (Fun)*((int*)*(int*)(&b) + 4);
    	pFunc();
    	pFunc = (Fun)*((int*)*(int*)(&b) + 5);
    	pFunc();
    
    	return 0;
    }

    结果为:

    虚函数表地址0xbf85d2d8
    虚函数表中第1个函数地址0x8048bc8
    虚函数表中第2个函数地址0x8048bcc
    虚函数表中第3个函数地址0x8048bd0
    Base::f
    Base::g
    Base::h
    Derived::fd
    Derived::gd
    Derived::hd
    

    至此,可以清晰看到,派生类对象中的虚函数表包含了基类的虚函数与自己定义的虚函数,排列方式为基类在前,派生类在后。图示。
    o_vtable22

     

     

     

    除特别注明外,本站所有文章均为String me = "Creater\忠实的资深Linux玩家";原创,转载请注明出处来自http://unix8.net/home.php/749.html

    关于

    发表评论

    暂无评论

    切换注册

    登录

    忘记密码 ?

    切换登录

    注册

    扫一扫二维码分享