15.5.5 对象是不同的

认识到向上类型转换仅处理地址,这是重要的。如果编译器有一个它知道确切类型的对象,那么(在C++中)对任何函数的调用将不再使用晚捆绑,或至少编译器不必使用晚捆绑。因为编译器知道对象的确切类型,为了提高效率,当调用这些对象的虚函数时,很多编译器使用早捆绑。下面是一个例子:

15.5.5 对象是不同的 - 图1

15.5.5 对象是不同的 - 图2

在p1->speak()和p2.speak()中,使用地址,就意味着信息不完全:p1和p2可能表示Pet的地址,也可能表示其派生对象的地址,所以必须使用虚函数。而当调用p3.speak()时不存在含糊,编译器知道确切的类型且知道它是一个对象,所以它不可能是由Pet派生的对象,而确切的只是一个Pet。这样,可以使用早捆绑。但是,如果不希望编译器的工作如此复杂,仍然可以使用晚捆绑,并且会产生相同的行为。