目录
重载(overload)
重载是指在同一范围定义中的同名成员函数才存在重载关系。主要特点是函数名相同,参数类型和数目有所不同,不能出现参数个数和类型均相同,仅仅依靠返回值不同来区分的函数。重载和函数成员是否是虚函数无关
成员函数被重载的特征:
(1)相同的范围(在同一个类中);
(2)函数名字相同;
(3)参数不同;
(4)virtual 关键字可有可无。
class A{
virtual int fun();
void fun(int);
void fun(double, double);
static int fun(char);
}
覆盖(重写override)
覆盖是指派生类函数覆盖基类函数,特征是:
(1)不同的范围(分别位于派生类与基类);
(2)函数名字相同;
(3)参数相同;
(4)基类函数必须有virtual 关键字。
(5)协变,基类中返回的是基类的指针或引用,可以修改为返回派生类的指针或引用。
class A{
public:
virtual int fun(int a){}
};
class B : public A{
public:
//重写,一般加override可以确保是重写父类的函数
virtual int fun(int a) override{}
};
协变
在C++中,只要基类函数的返回类型是基类类型的指针或引用,子类函数的返回值类型是派生类的指针或引用,覆盖的方法就可以改变返回类型,这样的返回类型称为协变返回类型。
class Base{
public:
virtual Base & operator=(const Base & b){
cout << "Base::operator=(const Base& b)" << endl;
return *this;
}
};
class Derived : public Base {
public:
virtual Derived& operator=(const Base& b) {
cout << "Derived::operator=(const Base& b)" << endl;
return *this;
}
};
重写与重载区别
-
重写是父类和子类之间的垂直关系,重载是不同函数之间的水平关系
-
重写要求参数列表相同,重载则要求参数列表不同,返回值不要求
-
重写关系中,调用方法根据对象类型决定,重载根据调用时实参表与形参表的对应关系来选择函数体
隐藏(重定义)
“隐藏”是指派生类的函数屏蔽了与其同名的基类函数,规则如下:
(1)如果派生类的函数与基类的函数同名,但是参数不同。此时,不论有无virtual关键字,基类的函数将被隐藏(注意别与重载混淆)。
class A{
public:
virtual void fun(int a){
cout << "A中的fun函数" << endl;
}
};
class B : public A{
public:
//隐藏父类的fun函数
virtual void fun(char* a){
cout << "A中的fun函数" << endl;
}
};
int main(){
B b;
b.fun(2); //报错,调用的是B中的fun函数,参数类型不对
b.A::fun(2); //调用A中fun函数
return 0;
}
(2)如果派生类的函数与基类的函数同名,并且参数也相同,但是基类函数没有virtual 关键字。此时,基类的函数被隐藏(注意别与覆盖混淆)。
class A{
public:
void fun(int a){
cout << "A中的fun函数" << endl;
}
};
class B : public A{
public:
//隐藏父类的fun函数
void fun(int a){
cout << "B中的fun函数" << endl;
}
};
int main(){
B b;
b.fun(2); //调用的是B中的fun函数
b.A::fun(2); //调用A中fun函数
return 0;
}
和隐藏(重定义)的区别&spm=1001.2101.3001.5002&articleId=128506033&d=1&t=3&u=a9a40238b4d54f2f99f53a623a273732)
1356

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



