今天写代码的时候,在思考到底是返回派生类对象,还是强制转换为基类对象,强制转换后为基类指针指向派生类的对象,指针的地址不同,但是指向的内容相同,这也就联想到了覆盖、隐藏,于是去百度了下,看到了一篇blog:http://www.cnblogs.com/renyuan/archive/2013/06/08/3127562.html,然后就明白多了
1、成员函数被重载的特征:
(1)相同的范围(在同一个类中);
(2)函数名字相同;
(3)参数不同;
(4)virtual关键字可有可无。
2、覆盖是指派生类函数覆盖基类函数,特征是:
(1)不同的范围(分别位于派生类与基类);
(2)函数名字相同;
(3)参数相同;
(4)基类函数必须有virtual关键字。
例如:
class base{
public:
void print()
{
cout<<"this is base print"<<endl;
}
virtual void vprint()
{
cout<<"this is base vprint"<<endl;
}
};
class child:public base{
public:
void print()//这不是重载,覆盖了基类的print
{
cout<<"this is child print"<<endl;
}
void vprint()//重写了基类的vprint,隐藏了基类的vprint
{
cout<<"this is child vprint"<<endl;
}
};
int main()
{
child *b=new child();
base *a=b;
a->print();
b->print();
a->vprint();
b->vprint();
return 0;
}
结果:
a为基类指向派生类的指针,b为派生类的指针
a->print()调用了基类中的print,因为派生类中所写的print与基类print同名,所以隐藏了基类的print,因为a为基类的指针,所以访问到的是基类的print
b->print()调用的是派生类的print,
a->vprint()调用的是派生类的vprint,因为加了virtual,覆盖了基类中的vprint,所以访问到的是派生类的vprint,若想访问基类的vprint,就只能通过基类的对象访问
b->vprint()调用派生类的vprint,