// Upcasting during array initialization: Instrument* A[] = { new Wind, new Percusion, new Stringed, new Brass, };
每当创建一个包含虚函数的类或从包含有虚函数的类派生一个类时,编译器就为这个类创建唯一的VTABLE,类中存放指向这个表的指针VPTR。因此不管类中有多少虚函数,都只需要一个指针。如果派生类中没有对基类中virtual进行重新定义,编译器就是用基类的这个虚函数的地址。VPTR不许被初始化为指向相应的VTABLE的其实地址,这在构造函数中发生。
对于所有的Instrument对象或由Instrument派生的对象,他们的VPTR都在对象的相同位置,通常在对象的开头,所以编译器能去除这个地址,得到VTABLE的起始地址,所有的VTABLE都具有相同的顺序,所以编译器知道adjust函数必在VPTR+2处。
因为获取VPTR和确定实际函数地址发生在运行时,所以得到了希望的晚捆绑。
原文:https://www.cnblogs.com/McFarland-Miriam/p/13461149.html