解析动态联编(上篇) - 作者:tingya,解析动态联编(上篇) - 作者:tingya
【 tulaoshi.com - C语言心得技巧 】
//1.cpp1. #include <iostream.h2. class shape{3. public:4. void draw(){cout<<"I am shape"<<endl;}5. void fun(){draw();}6. };7. class circle:public shape{8. public:9. void draw(){cout<<"I am circle"<<endl;}10. };11. main(){12. class circle oneshape;13. oneshape.fun();14. }程序的输出结果我们希望是"I am circle",但事实上却输出了"I am shape"的结果,造成这个结果的原因是静态联编。静态联编需要在编译时候就确定函数的实现,但事实上编译器在仅仅知道shape的地址时候无法获取正确的调用函数,它所知道的仅是shape::draw(),最终结果只能是draw操作束缚到shape类上。产生"I am shape"的结果就不足为奇了。
//2.cpp1. #include <iostream.h2. class shape{3. public:4. virtual void draw(){cout<<"I am shape"<<endl;}5. void fun(){draw();}6. };7. class circle:public shape{8. public:9. void draw(){cout<<"I am circle"<<endl;}10. };11. main(){12. class circle oneshape;13. fun(&oneshape);14. }程序执行得到了正确的结果"I am circle"。代码在VC6.0中执行。
//3.cpp1. #include <iostream.h>2. class shape_novirtual{3. int a;4. public:5. void draw(){cout<<"shape_novirtual::draw()"<<endl;}6. };7. class shape_virtual1{8. int a;9. public:10. virtual void draw(){cout<<"shape_vi
来源:http://www.tulaoshi.com/n/20160129/1485522.html
看过《解析动态联编(上篇) - 作者:tingya》的人还看了以下文章 更多>>