有点晕,昨天本来提交了这篇文章,但今天一看竟然没有了,是我没有放好,还是csdn的原因那(字数限制?)。不过没有关系,还是有时间把这篇文章重写一下。
1》重载是指的一个作用域里的,同名函数,不同参数(参数数目不同,或者对应参数的类型不同,返回值类型无关)的一组类成员函数,忽略virtual关键字;
class Base{
public:
virtual void func1(); //(1) -------------------|
int func1( int pm1);//(2)--------------------|overload
int func1(int pm1, int pm2);//(3)--|
}
class Derived: pulic Base {
public:
void func1();//(4)
int func1( int pm1);//(5)
int func1(double pm1);//(6)
}
2》覆盖是一种多态的体现,即子类对基类的虚函数进行了重写,要求函数名和参数,以及返回值均相同,基类需要virtual关键字支持;
(1)和(4)构成override, (2)与(5)不能构成,因为(2)没有virtual
3》隐藏表现为:基类有某个函数的多个重载函数,子类对其中部分的重载函数进行了重写,或者引入新的同名不同参数/返回值的新函数,则未被重写的其他的重载函数在父类中被隐藏掉了。
A (5)的存在,隐藏了(2)和(3),例子如下:
Derived* p = new Derived;
p->func1(2, 3); // 编译出错
B 通过基类指针指向父类时,新的重载函数被隐藏
上述int func1( int pm1);//(2)改为 virtual int func1( int pm1);//(2)
Base* p = new Derived;
p->func1(0.01); // 调用(5)而不是(6)
另外说明,覆盖或者重载,忽略范围(public/protected/private)差异
更多详尽的例子参考: http://www.chinaitpower.com/A/2002-04-23/20651.html
http://www.chinaitpower.com/A/2002-04-23/20652.html
http://www.chinaitpower.com/A/2002-04-23/20653.html
http://www.chinaitpower.com/A/2002-04-23/20654.html