虚在哪里?
虚函数成就了多态,意思就是指向基类的指针在操作它的多态类对象时,会根据不同的类实例,调用其相应的函数。关键词——继承/指针/实例
怎么实现的呢?
编译器针对虚函数采用“VTABLE”机制。编译器发现一个类中有被声明为virtual的函数,就会为其搞一个虚函数表,也就是VTABLE。VTABLE实际上是一个函数指针的数组,每个虚函数占用这个数组的一个slot。一个类只有一个VTABLE,不管它有多少个实例。ONE CLASS,ONE VTABLE . 派生类有自己的VTABLE,但是派生类的VTABLE与基类的VTABLE有相同的函数排列顺序,同名的虚函数被放在两个数组的相同位置上。在创建类实例的时候,编译器还会在每个实例的内存布局中增加一个vptr字段,该字段指向本类的VTABLE。通过这些手段,编译器在看到一个基类的虚函数调用的时候,就会将这个调用指向对应实例所属的那个类的虚函数。
示例说明?
//基类,virtual关键字处理
class A{
virtual void foo(){
print("from A\n");
}
}
//子类,方法名前virtual可加可不加,根据是否要继承B实现B方法的多态需求而定
class B:class A{
void foo(){
print("from B\n")
}
}
//实例化并调用
void call(){
A *a1 = new A();
A *a2 = new B();
a1->foo();
a2->foo();
}
输出结果是——
from a
from b