在浏览C++论坛时,我总是能发现很多C++初学者的提问帖子,都是关于动态绑定的。基本大意就是不完全理解
动态绑定该如何理解,造成一些面试或者实际编程上的困扰。本文就是针对这个问题作出的解答。作者并非技术大
牛,不当之处还请大家在评论中指出,在下万分感谢。
我对于C++动态绑定的理解,一句话,就是编译器用静态分析的方法加上虚拟函数的设计实现在程序运行时动态
智能执行正确虚拟函数的技术。因此要彻底理解动态绑定技术,只需要掌握两点,一是编译器的静态编译过程,二是
虚拟函数的基本知识。只要有了这两点理解,任何动态绑定的分析都是很容易的。
下面就以例子代码说明:
#include <iostream> using namespace std; class A { public: void fA() { cout << "A::fA()" << endl; } virtual void vfA() { cout << "A::vfA()" << endl; } void emptyB() { cout << "A::emptyB()" << endl; } void vfAonly() { cout << "A::vfAonly()" << endl; } }; class B : public A { public: void fB() { cout << "B::fB()" << endl; } virtual void vfA() { cout << "B::vfA()" << endl; } virtual void vfB() { cout << "B::vfB()" << endl; } void emptyA() { cout << "B::emptyA()" << endl; } virtual void vfAonly() { cout << "B::vfAonly()" << endl; } }; int main() { A* p = new B; B& r = *(B*)p; p->fA(); // 1 //p->fB(); // 2 p->vfA(); // 3 //p->vfB(); // 4 //p->emptyA(); // 5 p->emptyB(); // 6 p->vfAonly(); // 7 cout << endl; r.fA(); // 8 r.fB(); // 9 r.vfA(); // 10 r.vfB(); // 11 r.emptyA(); // 12 r.emptyB(); // 13 r.vfAonly(); // 14 delete p; return 0; } |