多态特性是C++最重要的特性之一,学习C++必须学习这一特性。多态性是指相同对象收到不同消息或不同对象收到相同消息时产生不同的动作。
虚函数是实现多态性的必要条件,只有虚函数才能被重写(重写是指在派生类中重新定义基类中的函数),所以要想学习多态性就要了解虚函数。
虚函数是指在某基类中声明为 virtual 并在一个或多个派生类中被重新定义的成员函数。实现多态性时通过指向派生类的基类指针或引用,访问派生类中同名覆盖成员函数 。
提到虚函数就不得不提虚函数表,而虚函数表又是指什么呢?虚函数表是指指向虚函数地址的指针数组 , 是在编译时构建的。
下面我们通过代码来深入了解一下虚函数和虚函数表!
我们先简单写一个类:
当类中没有虚函数时:
class Father
{
public:
int fa1;
int fa2;
void Two(){
}
};
此时内存布局很简单
当类中有一个虚函数时:
class Father
{
public:
int fa1;
int fa2;
virtual void One(){
}
void Two(){
}
};
此时的内存布局为
可以看出编译时在定义的变量之前自动开辟出一块内存存放一个名为_vfptr的二维指针(void**),指向虚函数的地址,这就可以看作虚函数表,即指向虚函数地址的指针。
理解了什么是虚函数和虚函数表,我们就来看看多态性是怎样利用虚函数来体现的。
基类中的虚函数可以在派生类中被重写,重写后虚函数就可以发生虚函数的覆盖,就可以(在有些情况下)发生派生类虚函数的作用而不发生基类中该函数的作用。