覆盖(override):
1.不同作用域下(特指基类和派生类中);
2.函数名相同;参数列表列表相同;返回类型相同;
3.基类函数必须有virtual修饰;
4.父类和子类的访问限定可以不同。
满足以上条件时,称子类这个函数覆盖了父类的这个虚函数。完全相同代表着两个函数的函数名、参数个数、参数类型、返回值类型都相同(协变除外)
覆盖的作用:
实现动态的多态(同一接口,不同实现)。
多态相关:https://www.cnblogs.com/hai-ping/articles/2807750.html
#include<iostream>
using namespace std;
/*一般覆盖,实现动多态*/
class Base
{
public:
virtual void Show()
{
cout << "Base::Show()" << endl;
}
protected:
int ma;
};
class Derive :public Base
{
public:
/*在子类中定义了一个和父类虚函数完全相同的函数;
如果不显示加上virtulal修饰,编译器会默认为虚函数。
*/
void Show()
{
cout << "Derive::Show()" << endl;
}
protected:
int mb;
};
void Fun(Base* p)
{
p->Show();
}
void Fun(Base& p)
{
p.Show();
}
int main()
{
Base p;
Fun(p);//Base:show
Fun(&p);//Base:show
Derive d;
Fun(d);//Derive:show
Fun(&d);
return 0;
}
协变:子类的虚函数和父类中的虚函数的函数名、参数个数、参数类型都相同,只是返回值类型不同,父类的虚函数返回的时父类的指针或者引用,子类的虚函数返回的时子类的指针或者引用,这种情况下也会产生子类的虚函数覆盖父类的虚函数
这种情况下也会发生覆盖!!!
#include<iostream>
using namespace std;
/*协变:返回值类型不同*/
class Base
{
public:
virtual Base &Show()
{
cout << "Base ::Show()" << endl;
return *this;
}
};
class Derive :public Base
{
public:
Derive & Show()
{
cout << "Derive::Show()" << endl;
return *this;
}
};
void Fun(Base* p)
{
p->Show();
}
void Fun(Base& p)
{
p.Show();
}
int main()
{
Base p;
Fun(p);
Fun(&p);
Derive d;
Fun(d);
Fun(&d);
return 0;
}