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++中的覆盖的定义,要与隐藏区分开来。
相关文章推荐
- (转)C++多态的实现原理,C++中虚函数和多态
- C++中虚函数实现原理揭秘
- c++远征之多态篇——虚函数及其实现原理
- C++函数编译原理和成员函数的实现
- [C++再学习系列] 派生类函数的重实现规则(override-覆盖)
- C++函数可变参数实现原理探究——以实现printf为例
- C++的虚函数的实现原理
- C++学习之多态篇(虚函数和虚析构函数的实现原理--虚函数表)
- 深入探究C++中虚函数和虚析构函数的实现原理
- C++中虚函数的实现原理
- C++中虚函数的实现原理
- C++多态实现(虚函数,成员函数覆盖、隐藏)
- c++中函数重在的实现原理
- C++函数编译原理和成员函数的实现
- C++对象模型之虚函数实现原理
- 【高级】C++中虚函数机制的实现原理
- C++对象模型之虚函数实现原理
- C语言中的可变参数-printf的实现原理 在C/C++中,对函数参数的扫描是从后向前的。C/C++的函数参数是通过压入堆栈的方式来给函数传参数的(堆栈是一种先进后出的数据结构),最先压入的参数最后出
- C++函数重载实现的原理以及为什么在C++中调用C语言编译的函数时要加上extern "C"声明
- C++ 多态中虚函数实现原理分析