阿布的天空,只做收集...                                                                                                    Manage    NewBlog    Exit


«September 2025»
123456
78910111213
14151617181920
21222324252627
282930


公告

Welcome to iPUD's Sky!


我的分类(专题)

日志更新

最新评论

留言板

链接

Blog信息
blog名称:阿布的天空
日志总数:29
评论数量:39
留言数量:-32
访问次数:165836
建立时间:2006年3月21日




[C++基础]重载、覆盖、多态与函数隐藏(3)
文章收藏,  软件技术

阿布 发表于 2006/3/28 16:01:03

例8-2 #include <iostream> using namespace std;class Base{public:         virtual void fun(int i){ cout <<"Base::fun(int i)"<< endl; }}; class Derive : public Base{public:         void fun(int i){ cout <<"Derive::fun(int i)"<< endl; }          void fun(double d){ cout <<"Derive::fun(double d)"<< endl; }         };  int main(){         Base *pb = new Derive();         pb->fun(1);//Derive::fun(int i)         pb->fun((double)0.01);//Derive::fun(int i)         delete pb;         return 0;}  例9#include <iostream> using namespace std;class Base{public:         virtual void fun(int i){ cout <<"Base::fun(int i)"<< endl; }};class Derive : public Base{public:        void fun(int i){ cout <<"Derive::fun(int i)"<< endl; }        void fun(char c){ cout <<"Derive::fun(char c)"<< endl; }          void fun(double d){ cout <<"Derive::fun(double d)"<< endl; }         };#include <iostream> using namespace std;class Base{public:         virtual void fun(int i){ cout <<"Base::fun(int i)"<< endl; }};class Derive : public Base{public:        void fun(int i){ cout <<"Derive::fun(int i)"<< endl; }        void fun(char c){ cout <<"Derive::fun(char c)"<< endl; }          void fun(double d){ cout <<"Derive::fun(double d)"<< endl; }         };int main(){         Base *pb = new Derive();          pb->fun(1);//Derive::fun(int i)         pb->fun('a');//Derive::fun(int i)         pb->fun((double)0.01);//Derive::fun(int i)           Derive *pd =new Derive();         pd->fun(1);//Derive::fun(int i)          //overload          pd->fun('a');//Derive::fun(char c)                   //overload          pd->fun(0.01);//Derive::fun(double d)                    delete pb;         delete pd;         return 0;}  例7-1和例8-1很好理解,我把这两个例子放在这里,是让大家作一个比较摆了,也是为了帮助大家更好的理解:n          例7-1中,派生类没有覆盖基类的虚函数,此时派生类的vtable中的函数指针指向的地址就是基类的虚函数地址。n          例8-1中,派生类覆盖了基类的虚函数,此时派生类的vtable中的函数指针指向的地址就是派生类自己的重写的虚函数地址。在例7-2和8-2看起来有点怪怪,其实,你按照上面的原则对比一下,答案也是明朗的:n          例7-2中,我们为派生类重载了一个函数版本:void fun(double d)  其实,这只是一个障眼法。我们具体来分析一下,基类共有几个函数,派生类共有几个函数: 类型 基类 派生类 Vtable部分 void fun(int i) 指向基类版的虚函数void fun(int i) 静态部分     void fun(double d)  我们再来分析一下以下三句代码Base *pb = new Derive();pb->fun(1);//Base::fun(int i)pb->fun((double)0.01);//Base::fun(int i)  这第一句是关键,基类指针指向派生类的对象,我们知道这是多态调用;接下来第二句,运行时基类指针根据运行时对象的类型,发现是派生类对象,所以首先到派生类的vtable中去查找派生类的虚函数版本,发现派生类没有覆盖基类的虚函数,派生类的vtable只是作了一个指向基类虚函数地址的一个指向,所以理所当然地去调用基类版本的虚函数。最后一句,程序运行仍然埋头去找派生类的vtable,发现根本没有这个版本的虚函数,只好回头调用自己的仅有一个虚函数。这里还值得一提的是:如果此时基类有多个虚函数,此时程序编绎时会提示”调用不明确”。示例如下#include <iostream> using namespace std;  class Base{public:         virtual void fun(int i){ cout <<"Base::fun(int i)"<< endl; }                    virtual void fun(char c){ cout <<"Base::fun(char c)"<< endl; }}; class Derive : public Base{public:    void fun(double d){ cout <<"Derive::fun(double d)"<< endl; }  };  int main(){         Base *pb = new Derive();                    pb->fun(0.01);//error C2668: 'fun' : ambiguous call to overloaded function         delete pb;         return 0;}好了,我们再来分析一下例8-2。n          例8-2中,我们也为派生类重载了一个函数版本:void fun(double d)  ,同时覆盖了基类的虚函数,我们再来具体来分析一下,基类共有几个函数,派生类共有几个函数:  int main(){         Base *pb = new Derive();                    pb->fun(0.01);//error C2668: 'fun' : ambiguous call to overloaded function         delete pb;         return 0;}好了,我们再来分析一下例8-2。n          例8-2中,我们也为派生类重载了一个函数版本:void fun(double d)  ,同时覆盖了基类的虚函数,我们再来具体来分析一下,基类共有几个函数,派生类共有几个函数: 类型 基类 派生类 Vtable部分 void fun(int i) void fun(int i) 静态部分


阅读全文(1382) | 回复(0) | 编辑 | 精华
 



发表评论:
昵称:
密码:
主页:
标题:
验证码:  (不区分大小写,请仔细填写,输错需重写评论内容!)



站点首页 | 联系我们 | 博客注册 | 博客登陆

Sponsored By W3CHINA
W3CHINA Blog 0.8 Processed in 0.047 second(s), page refreshed 144760076 times.
《全国人大常委会关于维护互联网安全的决定》  《计算机信息网络国际联网安全保护管理办法》
苏ICP备05006046号