载入中...
 
     
 
载入中...
时 间 记 忆
载入中...
最 新 评 论
载入中...
专 题 分 类
载入中...
最 新 日 志
载入中...
最 新 留 言
载入中...
搜 索
用 户 登 录
载入中...
友 情 连 接
博 客 信 息
载入中...


 
 
载入中...
   
 
 
虚函数
[ 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
 
 
发表评论:
载入中...
 
     
   
     
Powered by Oblog.