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

    o_Drawing4上一篇C++虚函数表在一般继承(没有重写基类的虚函数情况下)时虚函数的分布。

    通常派生类都是需要覆盖基类的虚函数来达到多态的目的。

    如图所示,基类的3个虚函数,在派生类中有一个被覆盖,另外两个被继承,而且派生类中定义了2个虚函数。

    还是先看代码,以及运行结果。

     

     

     

    #include
    #include
    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 f() { 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();
    	return 0;
    }

    运行结果为:

    虚函数表地址0xbf950c58
    虚函数表中第1个函数地址0x8048b88
    虚函数表中第2个函数地址0x8048b8c
    虚函数表中第3个函数地址0x8048b90
    Derived::fd
    Base::g
    Base::h
    Derived::gd
    Derived::hd
    

    由此可以看出,首先检查基类的virtual函数,如果在派生类中有覆盖,则将派生类的该虚函数地址放入虚函数表;如果基类的virtual函数在派生类中没有覆盖,则将这些虚函数继承并将地址添加到虚函数表,最后是派生类自己定义的虚函数。
    o_vtable3
    如果有这样的代码:

    Base *base = new Derivesd();
    base->f();

    base所指内存的派生类对象的虚函数表中,f这个基类的虚函数已经被派生类的f替代。于是在实际调用发生时就实现了多态。

     

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

    关于

    发表评论

    暂无评论

    切换注册

    登录

    忘记密码 ?

    切换登录

    注册

    扫一扫二维码分享