C++覆盖(虚函数的实现原理)

来源:互联网 发布:淘宝店铺怎么关注链接 编辑:程序博客网 时间:2024/06/05 01:57
Class Shape{public:    virtual void cal_area()    {    }private:    int m_ir;};Class Circle:public Shape{public:    virtual void cal_area()    {    }};

类Circle继承类Shape

当用Shape类实例化一个指针对象,并

Shape *shape=new Circle;

此时的虚函数是如何实现的呢?
当实例化一个Shape对象时,除了生成数据成员,还会生成一个虚函数表指针成员,这个虚函数表指针与虚函数表同时出现,虚函数表只有一个,而虚函数表指针指向虚函数表的首地址,在虚函数表中定义了一个函数指针,这个函数指针指向了计算面积函数的首地址,当在主函数中调用了计算面积的函数时,编译器通过虚函数表指针找到虚函数表,再在虚函数表中找到指向计算面积函数的指针,通过这个指针找到函数的入口地址,从而调用虚函数。
这里写图片描述

当派生类Circle中没有同名的计算面积函数时,在实例化Circle的时候也会生成虚函数表指针和一个虚函数表,而虚函数表中也有一个指向计算面积函数的指针,这个指针是从它的基类中继承来的,所以当在主函数中调用计算面积函数时,可以调用基类中所定义的计算面积函数。

当派生类Circle中定义了同名的计算面积函数时(无论它前面有没有virtual修饰,只要基类中的同名函数被virtual修饰,那么编译器会自动给派生类中的同名函数加上virtual前缀),实例化Circle的时候也会生成虚函数表指针和一个虚函数表,而虚函数表中也有一个指向计算面积函数的指针,这个指针一开始的值是从基类继承而来,但在实例化Circle之后,这个值就会被Circle类中定义的计算面积函数的首地址所覆盖。
这里写图片描述

这就是C++中的覆盖的定义,要与隐藏区分开来。

0 0
原创粉丝点击