您的位置:首页 > 编程语言 > C语言/C++

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

2016-10-14 22:13 351 查看
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++中的覆盖的定义,要与隐藏区分开来。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: