欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

c++同名隐藏

程序员文章站 2022-03-15 21:02:21
同名隐藏不同作用域声明的标识符的可见性原则:若存在多个具有包含关系的作用域,外层声明了一个标识符 ,①内层没有再声明同名标识符,那么外层的标识符在内层依然可见。②内层声明了同名标识符,则外层标识符在内层中不可见。这种即为隐藏规则。同名隐藏在继承中的体现:在类的派生中,基类成员和派生类成员都有类作用域,二者是相互包含的两层,派生类在内层。所以若派生类声明了与基类同名的新属性/新函数(即使参数表不同),则触发了隐藏规则。(从基类继承的同名函数的所有重载形式也被隐藏)若要访问被隐藏的成员,需要用作用域...

同名隐藏

不同作用域声明的标识符的可见性原则:

若存在多个具有包含关系的作用域,外层声明了一个标识符 ,①内层没有再声明同名标识符,那么外层的标识符在内层依然可见。②内层声明了同名标识符,则外层标识符在内层中不可见。

这种即为隐藏规则。

同名隐藏在继承中的体现:

在类的派生中,基类成员和派生类成员都有类作用域,二者是相互包含的两层,派生类在内层。所以若派生类声明了与基类同名的新属性/新函数(即使参数表不同),则触发了隐藏规则。(从基类继承的同名函数的所有重载形式也被隐藏)

若要访问被隐藏的成员,需要用作用域分辨符::和基类名来限定。

//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

相关标签: C++