- non-virtual函数是静态绑定(early binding/staticlly bound),virtual函数是动态绑定(dynamically bound/late binding)
静态类型:在程序中被声明时采用的类型。
动态类型:则是指目前所指对象的类型,动态类型可以表现出一个对象会有什么行为。
class A {}; class B:public A{}; class C:public A{}; int main() { A* a; // a没有动态类型 A* b = new B; // b的动态类型为 B* b = new C; // b的动态类型变为C* return 0; }
a和b的静态类型都是A*(声明为A*),b的动态类型是在程序运行过程中变化的。
- Virtual函数系动态绑定而来,意思是调用一个virtual函数,具体调用哪一个函数实现代码,取决于发出调用的对象的动态类型。
#include <iostream> class A { public: virtual void test() { printf("====AA\n"); } }; class B:public A{ public: virtual void test() { printf("====BB\n"); } }; int main() { A a; a.test(); // 实际调用对象为 class A A *a1 = new B; a1->test();// 实际调用对象为 class B,虽然它动态绑定为A return 0; }