|
|
| |
|
| |
| |
| 虚函数 |
|
[ 2008-9-30 18:06:00 | By: wantnon ] |
从逻辑上讲,子类对象也是基类对象,所以基类指针也可以操作子类对象。 注:这样带来的方便是,可以将同一基类下不同类层次的对象放于同一数组中,然后用基类指针进行统一遍历。 当子类中用到基类的同名操作,但实现又不同于基类函数时,自然需要在子类中重载基类成员函数。但单纯地重载会出现下面不合理现象: 若子类对象通过点运算符调用成员函数,调用的就是子类成员函数,没有问题;但若通过基类指针调用子类对象的成员函数时,调用的却是基类成员函数,这是不合理的。 可通过虚函数来消除此不合理现象:将基类中被子类重载的函数声明为虚的(加virtual修饰),然后再用基类指针调用子类对象的成员函数时,调用的就确实是子类成员函数了。 注:将基类某成员函数声明为虚函数以后,子类中相应的重载函数也就自动成为了虚的(无论是否加virtual修饰),但为了清晰起鉴,最好也加上virtual。 例子: 1,单纯函数重载: #i nclude<iostream.h> class Chuman { public: print(){cout<<"human"<<endl;}; }; class Cman:public Chuman { public: print(){cout<<"man"<<endl;}; }; main() { cout<<"点运算访问: "; Cman man1; man1.print (); cout<<"基类指针访问: "; Chuman*phuman=&man1; phuman->print (); } 运行结果: 点运算访问: man
基类指针访问: human 2,加入虚函数声明: #i nclude<iostream.h> class Chuman { public: virtual print(){cout<<"human"<<endl;}; }; class Cman:public Chuman { public: print(){cout<<"man"<<endl;}; }; main() { cout<<"点运算访问: "; Cman man1; man1.print (); cout<<"基类指针访问: "; Chuman*phuman=&man1; phuman->print (); } 运行结果: 点运算访问: man 基类指针访问: man |
|
| | |
|