c++虚函数详解

  虚函数是学习c++的一个大的门槛。古人云:学而不思则罔,死而不学则殆,编程一个道理,不经要多看书,也要勤动手联系。在这里总结一下关于虚函数的相关知识。

  首先什么是虚函数呢?虚函数没有明确的定义,就是说在函数在函数前面加上关键字的函数就叫虚函数。静态函数不能定义为虚函数。为什么要有虚函数呢。看下面这个列子:



 




结果:

Bill is a  is a employee

John is a manger

  就说不同类型的对象调用不同的成员函数,假如没有虚函数的话,我们要怎么办?那需要类里加成员变量来标记它是那个类型的,要有兴趣可以试试不用虚函数实现这个方法。虚函数其实就是来实现类型多态,和代码重用的。对于子类和父类说共同的东西我继承直接用就行了,对于子类扩展的属性,可能有好多子类都继承父类。这时候父类只需要提供虚函数接口就行了。

  现在说说虚函数的原理。当对象初始化的时候,有个this指针,其实它指向对象在内从里的初始位置。它是一个指针,而这个指针又指向了一个地方,这个地方就是虚函数表。只要类成员函数里有virtual关键字,就会初始化一个虚函数表。而子类也有自己的虚函数表,如果重载父类虚函数的话,子类虚函数覆盖掉父类虚函数。这里大家估计比较晕了,重载的时候不也是子类覆盖父类定义的函数吗?呵呵,这里又提到一个动态连编的问题。假如不定义为虚函数的话,编译器编译的时候就把指针指向调用的函数。像上面的例子都会调用父类的PrintE函数。其实就是隐式的将manger类转为employe类了。而定义virtual的话,在执行的时候根据不同的类型掉用不同的函数,这就是动态连编。好了,理论先说到这里,给大家画个图看看就明白怎么回事了。

虚函数结构关系

  就是说在构造对象的时候会分配一段内从用来储存指向虚函数表的指针。当程序运行的时候,如果是虚函数,就将指针指向虚函数表,执行相应的函数。这也提到了动态连编是指针或者引用,才能动态连编。

  这大概就是为什么要设计虚函数这么个东西,以及它运行的原理。可是里面有很多主意的小细节都需要自己慢慢挖掘和总结。比如说,父类定义了虚函数,子类重载的时候也是虚的,不用在加关键字了。还有纯虚函数,就是告诉编译器。我这个只能申明接口,不能创建对象。还有就是多重继承里析构函数要用虚函数,因为析构函数是从子类到父类的方向进行析构的。delete子类对象的时候,如果不是虚函数的话,直接调用父类的析构函数,而不会调用子类的析构函数。造成了内从泄露。

   c++是一个要把握细节性的语言,正如前面讲的。多思考,多联系,才是学好这门语言的根本。

原文链接: https://www.cnblogs.com/fengju/archive/2010/11/07/6174364.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

    c++虚函数详解

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/17065

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月7日 下午5:33
下一篇 2023年2月7日 下午5:34

相关推荐