获得的不 获得的不 是函数的地址,而是一段间接获得虚函数地址的一段代码的地址,我们 是函数的地址 而是一段间接获得虚函数地址的一段代码的地址 我们 而是一段间接获得虚函数地址的一段代码的地址 编译器在编译时,会提供 形象地把这段代码看作那段 CallVirtualFun.编译器在编译时 会提供 编译器在编译时 这样的代码,当你调用虚函数时 当你调用虚函数时,其实就是先调 类似于 CallVirtualFun 这样的代码 当你调用虚函数时 其实就是先调 的代码,通过这段代码 通过这段代码,获得虚函数地址 用的那段类似 CallVirtualFun 的代码 通过这段代码 获得虚函数地址 最后调用虚函数,这样就真正保证了多态性 后 ,最后调用虚函数 这样就真正保证了多态性 同时大家都说虚函数 最后调用虚函数 这样就真正保证了多态性.同时大家都说虚函数 的效率低,其原因就是 在调用虚函数之前 的效率低 其原因就是,在调用虚函数之前 还调用了获得虚函数地址 其原因就是 在调用虚函数之前,还调用了获得虚函数地址 的代码. 的代码 最后的说明:本文的代码可以用 通过编译, 最后的说明 本文的代码可以用 VC6和 Dev-C++4.9.8.0通过编译 和 通过编译 且运行无问题.其他的编译器小弟不敢保证 其中 且运行无问题 其他的编译器小弟不敢保证.其中 里面的类比方法只 其他的编译器小弟不敢保证 其中,里面的类比方法只 能看成模型,因为不同的编译器的低层实现是不同的 例如 this 指 能看成模型 因为不同的编译器的低层实现是不同的.例如 因为不同的编译器的低层实现是不同的 就是通过压栈,当作参数传递 当作参数传递,而 针,Dev-C++的 gcc 就是通过压栈 当作参数传递 而 VC 的编译器则通 的 过取出地址保存在 ecx 中.所以这些类比方法不能当作具体实现 所以这些类比方法不能当作具体实现