美文网首页
关于虚函数

关于虚函数

作者: L丶匆匆 | 来源:发表于2019-02-14 23:40 被阅读0次

面向对象语言的三大特点:封装、继承、多态。虚函数正是多态的实现基础。

什么是多态?多态就是通过同一种方法得到不同的结果的一种现象。它是通过虚函数实现的,虚函数是前面加了virtual修饰的成员函数。

虚函数的实现方式?当我们通过一个父类类型的指向派生类的指针来调用一个普通的成员函数时,调用的其实都是父类的成员函数,因为指针类型是父类,而父类的普通成员函数是对所有对象共有的。但如果这个指针调用虚函数,那么调用的则是对应派生类的虚函数,因为成员产量是每个对象私有的,在生成对象后,每个对象对应的堆区头部会生成一个指向虚表的指针,这个指针也相应的是每个对象所私有的,然后通过虚表找到对应虚函数的位置来执行相应虚函数。正是因为虚指针vptr在堆区是每个对象私有的,所以不同对象调用虚函数对应各自的结果。这就是虚函数的实现原理。

最后,构造函数和析构函数能否是虚函数呢?答案是构造函数不能而析构函数能。因为构造函数是实例化对象的,而虚指针是实例化后的对象拥有的,所以在未实例化完对象之前是无法通过对应虚指针来找到对应虚函数的,所以构造函数不能是虚函数。而析构函数可以,我们知道派生类会在父类基础上再建立属于自己的成员,所以当析构时也会希望能够把自己的成员也析构掉,所以析构函数可以是虚函数且最好是虚函数。

相关文章

网友评论

      本文标题:关于虚函数

      本文链接:https://www.haomeiwen.com/subject/dnjueqtx.html