c++隐藏和覆盖详解
首先隐藏和覆盖是针对基类和子类的两个函数
而非同一个类中的函数(那是重载)
覆盖: 子类覆盖基类
只有一种情况: 同名同参,基类必须有virtual
隐藏: 子类隐藏基类
同名同参 基类必须无virtual
同名不同参 virtual有无都随意
判断运行结果
隐藏看指针类型
覆盖看实体类型
重载看参数
先不需要理解,只需要记住上面几点下面我们开始分析程序
#include <iostream>
using namespace std;
class Base
{
public:
void s(){cout << "base :: s" << endl;} //父类独有某个函数
/*单继承的情况下:
//父类和父子类都virtual 效果一样
//仅仅子类virutal 相当于没有加virtual
*/
virtual void g(int x){cout << "base :: g" << endl;} //父类virtual
void h(int x){cout << "base :: h" << endl;} //子类virtual
virtual void v(int x){cout << "base :: v" << endl;} //父子类都virtual
/*隐藏*/
//1. 父子类同样的函数名, 但是参数不一样, 父类被隐藏.(与virtual无关)
//2. 父子类同名同参函数, 但是父类没有virtual, 父类被隐藏
//对于第二条 例如函数 f() 和 h()
void hide(int x){cout << "base hide" << endl;}
void f(int x){cout << "base :: f" << endl;}
};
class Drived : public Base
{
public:
void g(int x){cout << "drived :: f" << endl;}
virtual void h(int x){cout << "drived :: f" << endl;}
virtual void v(int x){cout << "drived :: v" << endl;}
/*隐藏*/
void hide(int x, int y){cout << "drive hide " << endl;}
void f(int x){cout << "drived :: f" << endl;}
};
int main11()
{
Drived d;
//自己调用自己当然都是drive咯
d.s(); //ok base 子类成员可以调用父类独有的函数名
d.f(1); // drive
d.g(1); // drive
d.h(1); // drive
d.v(1); // drive
d.hide(1, 1);// drive
//d.hide(1); //error 调用格式正确 但是父类被隐藏无法调用
/*同上 全是base*/
Base b;
b.f(1);
b.g(1);
b.h(1);
b.v(1);
b.hide(1);
return 0;
}
int main6()
{
Base b;
Drived *p;
//p = &b; //报错, 子类指针怎么可以越俎代庖呢?
return 0;
}
"重点来了 隐藏覆盖主要就是针对以下的情况"
int main()
{
Base *pb;
Drived *pd;
Drived d;
//覆盖: 同名同参+父类加上virtual 基类的函数被子类覆盖掉
//隐藏: 同名同参无(基类)virtual 同名不同参(virtual随意)
//结果:
//重载看参数
//覆盖看实体对象类型
//隐藏看指针类型
pb = &d;
pd = &d;
pb->f(1); //1. base 同名同参无virtual) 看指针
pb->h(1); //2. base 同上(基类无virtual)
pb->g(1); //3. drive 覆盖 同名同参基类有virtual 看实体
pb->v(1); //4. drive 同上
pb->hide(1); //5. base 同名不同参, 看指针
pd->f(1); // drive 隐藏 理由同1 看指针 是drive
pd->h(1); // drice 隐藏 同2
pd->g(1); // drive 同3 看实体
pd->v(1); // drive 同4
pd->hide(1,1); // drive 同5
return 0;
}