码迷,mamicode.com
首页 > 其他好文 > 详细

this指针的隐式动态绑定

时间:2014-08-21 11:05:03      阅读:181      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   color   2014   div   代码   amp   

 

遇到了这一段代码:

class CBase
{
public:
    virtual void virfun() //虚函数
    {
        cout<<"base virfun\n";
    }
    void memfun() //非虚
    {
        this->virfun();//this指针永远指向基类,无论其是否有派生类
    }
};
class CDerive:public CBase
{
    virtual void virfun()
    {
        cout<<"derive virfun \n";
    }
};
int main()
{
    CDerive obj;
    obj.memfun();  //通过对象来调用非虚函数memfun,而不是基类指针或引用
    
    cin.get();
}

输出:

bubuko.com,布布扣

main函数中,obj对象在memfun中调用的是派生类虚函数。

疑问:

我并没有通过指针或者引用来调用派生类对象,为什么还发生了多态呢?

很多人在调用obj.memfun()的时候发生了切割(派生类对象被切割成基类对象),而非动态绑定。

起始不然,这是因为在调用memfun函数的时候发生了this指针隐式的动态绑定

obj.memfun();                   //注意memfun函数原型为:memfun(CBase *this); (而不是memfun(CBase this)) ,memfun()中的参数this指针永远是指向CBase

obj.memfun()函数在编译器中展开伪码为:

CBase *this =static_cast<CBase *>&obj;       //注意这时候发生了动态绑定,基类this指针指向了派生类对象

memfun(this);                    //注意这时候this指针指向了派生类对象obj,发生了动态绑定,所以在memfun函数体中调用虚函数virfun()的时候,调用的

自然就是派生类对象的virfun()函数了。

this指针的隐式动态绑定,布布扣,bubuko.com

this指针的隐式动态绑定

标签:style   blog   http   color   2014   div   代码   amp   

原文地址:http://www.cnblogs.com/sunbing/p/3926549.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!