c++同名隐藏
程序员文章站
2022-06-26 16:27:10
同名隐藏不同作用域声明的标识符的可见性原则:若存在多个具有包含关系的作用域,外层声明了一个标识符 ,①内层没有再声明同名标识符,那么外层的标识符在内层依然可见。②内层声明了同名标识符,则外层标识符在内层中不可见。这种即为隐藏规则。同名隐藏在继承中的体现:在类的派生中,基类成员和派生类成员都有类作用域,二者是相互包含的两层,派生类在内层。所以若派生类声明了与基类同名的新属性/新函数(即使参数表不同),则触发了隐藏规则。(从基类继承的同名函数的所有重载形式也被隐藏)若要访问被隐藏的成员,需要用作用域...
同名隐藏
不同作用域声明的标识符的可见性原则:
若存在多个具有包含关系的作用域,外层声明了一个标识符 ,①内层没有再声明同名标识符,那么外层的标识符在内层依然可见。②内层声明了同名标识符,则外层标识符在内层中不可见。
这种即为隐藏规则。
同名隐藏在继承中的体现:
在类的派生中,基类成员和派生类成员都有类作用域,二者是相互包含的两层,派生类在内层。所以若派生类声明了与基类同名的新属性/新函数(即使参数表不同),则触发了隐藏规则。(从基类继承的同名函数的所有重载形式也被隐藏)
若要访问被隐藏的成员,需要用作用域分辨符::和基类名来限定。
//demo1 属性的同名隐藏
class Parent
{
public:
int m;
Parent()
{cout<<"Parent():"<<"&m="<<&m<<endl;}
};
class Child:public Parent
{
public:
int m;
Child()
{cout<<"Child():"<<"&m="<<&m<<endl;}
};
main
{
Child c;
c.m=100;
c.Parent::m=1000;
cout<<"&c.m="<<&c.m<<endl;
cout<<"c.m="<<c.m<<endl;
cout<<"&c.Parent::m="<<&c.Parent::m<<endl;
cout<<"c.Parent::m="<<c.Parent::m<<endl;
}
//demo1的输出
Parent():&m=0x68fee8//先调用父类构造函数再调用子类构造函数
Child():&m=0x68feec
&c.m=0x68feec
c.m=100//2,3,4行说明父类中的同名变量被成功覆盖
&c.Parent::m=0x68fee8
c.Parent::m=1000
//demo2 函数的同名隐藏
class Parent
{
public:
int m;
Parent()
{cout<<"Parent():"<<"&m="<<&m<<endl;}
void add(int v)
{m+=v;}
void add(int a,int b)
{m+=(a+b);}
};
class Child:public Parent
{
public:
int m;
Child()
{cout<<"Child():"<<"&m="<<&m<<endl;}
void add(int x,int y,int z)
{m+=(x+y+z);}
};
main
{
Child c;
c.add(4,5,6);//可行
c.add(4,5);//报错:无法匹配到child::add(int,int)
c.add(4);//报错:无法匹配到child::add(int)
}
重载,重定义和重写
重载
**函数重载的本质:**为多个不同的函数,函数名和参数列表是唯一的标识,且它们只能在同一作用域中。
解读:
- 由于作用域不同,所以子类不能重载父类中的成员函数
- 函数名必须相同,参数个数/类型/顺序必须有一个不同
- 与返回类型无关
重定义 也称隐藏
- 派生类函数名与子类相同,但参数列表不同。此时不管有无virtual,基类函数都被隐藏
- 派生类函数名和参数列表都与基类相同,但基类函数没有virtual,此时基类函数被隐藏(若有virtual则属于覆盖)
重写 也称覆盖
被重写的函数不能是static,必须是virtual(在最原始基类中被声明为virtual),重写函数的访问修饰符可不同
本文地址:https://blog.csdn.net/qq_45942662/article/details/110261499
上一篇: 刘翼光, 导师:沈理,动态人脸识别系统