C++每日一问:什么是虚函数?虚函数的实现原理是什么?
Posted 努力的yhn
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++每日一问:什么是虚函数?虚函数的实现原理是什么?相关的知识,希望对你有一定的参考价值。
1 什么是虚函数?
虚函数是在基类中使用virtual声明的函数。当在编写类函数代码的时候,不确定调用 的基类的类函数代码还是派生类的类函数代码,即需要在运行时刻确定(动态绑定),所以定义为"虚"函数。
虚函数声明:
virtual void foo()
当在基类中没有具体的实现、但要求每个派生类必须实现此类函数时,需要纯虚函数。其在基类中声明但不实现,且在函数原型后必须加"=0", 如
virtual void function()=0
;多态就是多种形态、动态绑定。多态和虚函数紧密相连,其意味着:当对象调用类函数时,根据对象类型来执行不同的函数。
更多需要注意的点:
在很多情况下,基类本身生成对象是不合情理的。例如,动物作为一个基类可以派生出老虎、孔雀等子类,但动物本身生成对象明显不合常理, 所以需要纯虚函数以实现多态。含有纯虚函数的类称为抽象类,它不能生成对象;
友元不是成员函数,只有成员函数才可以是虚拟的,因此友元不能是虚函数;
析构函数需要定义为虚函数,这样在实现多态时才能调用子类的析构函数;否则只会调用父类的析构函数
2 虚函数的实现原理是什么?
class A {
public:
virtual void vfunc1();
virtual void vfunc2();
void func1();
void func2();
private:
int m_data1, m_data2;
};
vptr指针
虚表是属于类的,而不是属于某个具体的对象,一个类只需要一个虚表即可。同一个类的所有对象都使用同一个虚表。为了指定对象的虚表,对象内部包含一个虚表的指针,来指向自己所使用的虚表。为了让每个包含虚表的类的对象都拥有一个虚表指针,编译器在类中添加了一个指针,*__vptr,用来指向虚表。这样,当类的对象在创建时便拥有了这个指针,且这个指针的值会自动被设置为指向类的虚表。
以上是关于C++每日一问:什么是虚函数?虚函数的实现原理是什么?的主要内容,如果未能解决你的问题,请参考以下文章
为什么析构函数必须是虚函数?为什么C++默认的析构函数不是虚函数