C++中,必然会接触到虚函数这个概念,那么,会不会对虚函数的内部机理产生疑问呢?而这里,就是对其的简单的研究(本人水平有限(。•́︿•̀。) )
首先,先来简单介绍一下虚函数的机制(知道的跳过)
把父类的函数写成虚函数,子类继承后,接着重写该函数。然后在主函数中用子类对象调用该函数时会调用子类重写的函数。
虚函数机理
首先,当给父类的一个函数写上virtual后,那么,系统就会给父类分配一个虚函数指针,指向一个虚函数表,虚函数表当中,保存的就是该函数的地址,写几个虚函数,虚函数列表里就有几个成员。
当子类继承父类时,会继承虚函数指针,同时系统会给子类分配一个虚函数表,而虚函数指针指向虚函数表。虚函数表中的内容与父类一样,如果重写,则会对虚函数列表里的地址进行覆盖,其保存的,则是重写的函数对应的代码区地址。
关于虚函数的一些进阶问题
到这里,我们就大概了解了虚函数的的内部机理。但还是有几个问题值得我们去思考,当然,这也是我对读者们的挑战(哼哼)从而更深入地了解c++这一门语言的细节(❀」╹□╹)」*・
问题一:为什么不能把父类构造函数写成虚析构?
问题二:如果要用父类指针创建子类对象时,为什么要最好把父类析构写成虚析构?
最后,附图一张
欢迎评论,吐槽也可鸭🦆