在C++中有三种概念,重载、覆盖、隐藏,这三种概念比较相似,但其中仍旧有很大区别!
重载:
我们经常使用函数的重载,最简单的重载,在我们使用一些排序算法时,如果数据类型发生改变,比如开始我们是根据int型数组来写的排序算法,但是当我们想对double类型数组也使用时,我们在没学习类模板与函数模板前会将刚才写的int型数据的排序算法复制一遍,然后将相关参数改为double型。
这样一来,在调用排序算法时,如果参数时int型,就会调用int的排序函数,参数是double型,就会调用double的排序函数,这就属于函数的重载。
所以重载函数的特性:
(1)在同一个作用域中
(2)函数名字相同
(3)形参列表不同(包括不同类型形参先后顺序不同)
(4)virtual关键字可有可无
class A
{
public:
void Func(int a,int b) {cout<<“Func(int,int)”<<endl;}
void Func(int a) {cout<<“Func(int)”<<endl;}
};
int main()
{
A a;
a.Func(5);
a.Func(5,7);
return 0;
}

这时在调用函数名相同的函数时编译器会自己根据形参列表的最佳匹配来调用函数,上面的代码结果就是Func(int)。
注意:返回值类型不能作为函数重载依据。
覆盖:
覆盖的特点:分别位于基类和派生类中,同名同参,并且基类的函数被virtual所修饰。
这时调用该函数时会通过虚表调用的是派生类中的函数,基类的函数被覆盖。
例:
class A
{
public:
virtual void Func(){cout<<"AFunc()"<<endl;}
};
class B:public A
{
public:
void Func(){cout<<"BFunc()"<<endl;}
};
int main()
{
A a;
B b;
a.Func();
b.Func();
return 0;
}

这时b调用的就是类B中的Func()函数,并不会调用从A中继承的Func()函数的。
隐藏:
隐藏的特点:分别位于基类和派生类中
a.同名不同参
b.同名同参且基类函数未被virtual所修饰
例:
同名不同参
class A
{
public:
void Func(int a) { cout << "AFunc(a)" << endl; }
};
class B :public A
{
public:
void Func() { cout << "BFunc()" << endl; }
};
int main()
{
B b;
A a;
a.Func(8);
b.Func();
return 0;
}

同名同参且基类函数未被virtual所修饰
class A
{
public:
void Func() { cout << "AFunc(a)" << endl; }
};
class B :public A
{
public:
void Func() { cout << "BFunc()" << endl; }
};
int main()
{
B b;
A a;
a.Func();
b.Func();
return 0;
}

覆盖和隐藏的含义令人感觉很模糊,需要多加注意。
582

被折叠的 条评论
为什么被折叠?



