C++继承中同名非静态成员与静态成员的处理(学习笔记)

news/2024/11/19 22:54:51/

非静态成员:

定义一个父类Base,子类Son

class Base
{
public:int m_A = 10;int m_B = 200;void fun(){cout << "父类函数" << endl;}void fun(int a){cout << a << endl;}
};
class Son : public Base
{
public:int m_A = 100;float m_B = 2000;void fun(){cout << "子类函数" << endl;}
};

1.当子类与父类拥有同名的成员变量时,子类将会隐藏父类中拥有同名的成员变量

void test01()
{
    Son s;
    cout << s.m_A << endl;//子类成员变量 100

    cout << s.m_B << endl;//子类成员变量 float型 2000
}

调用父类的成员变量需加作用域

void test02()
{
    Son s;
    cout << s.Base::m_A << endl;//通过作用域调用父类成员变量 10

    cout << s.Base::m_B << endl;//通过作用域调用父类成员变量 int型 200
}

2.当子类与父类拥有同名的成员函数,子类将会隐藏父类中拥有同名的成员函数

void test03()
{
    Son s;
    s.fun();//子类成员函数
}

调用父类的成员变量需加作用域

void test03()
{
    Son s;

    s.Base::fun();//通过作用域调用父类成员函数
    s.fun(10);//错误,函数中调用的参数太多 即:父类的重载版本也被隐藏

    s.Base::fun(10);//通过作用域调用父类成员函数
}

因此:只要是有相同名字的函数(不在乎是否重载,还是完全相同),父类的一切同名的成员函数都将被隐藏。

好处:子类调用与父类同名成员函数时,解决了二义性的问题(即子类的成员函数与父类的成员函数完全相同时,调用的是子类的成员函数,加作用域才调用的是父类的成员函数)

总结:

1.当子类与父类拥有同名的成员时,子类将会隐藏父类中拥有同名的成员。

2.子类对象通过加作用域的方式访问被隐藏的父类同名成员。

静态成员:

前提知识:

静态成员:静态成员不属于某个对象上,所有对象都共享同一份数据。

通过两者方式进行访问:1.通过对象进行访问 ;2.通过类名进行访问(需加作用域)。

原则:

1.静态成员变量创建时,类内声明,类外定义。

2.静态成员函数创建时,类内声明,类外定义 或 类内声明,类内实现。

同名静态成员处理方式和同名非静态成员一样: 

当子类与父类拥有同名的静态成员时,子类将会隐藏父类中拥有同名的静态成员。

只是有两种方式:

 通过对象 或者 通过类名 进行访问 再加作用域的方式访问被隐藏的父类同名成员。

class Base
{
public:static int m_A ;static int m_B ;static void fun(){cout << "A函数" << endl;}void fun(int a){cout << a << endl;}
};
int Base::m_A = 10;
int Base::m_B = 200;
class Son : public Base
{
public:static int m_A ;static float m_B ;static void fun(){cout << "B函数" << endl;}
};
int Son::m_A = 100;
float Son::m_B = 2000;

当子类与父类拥有同名的成员时,子类将会隐藏父类中拥有同名的成员

void test01()
{
    Son s;
    cout << s.m_A << endl;//通过对象
    cout << s.m_B << endl;//通过对象
    cout << Son::m_A << endl;//通过类名 
    cout << Son::m_B << endl;//通过类名 
    s.fun();//通过对象
    Son::fun();//通过类名
}

调用父类的成员需加作用域

void test02()
{
    Son s;
    cout << s.Base::m_A << endl;  //对象访问 通过作用域调用父类成员变量
    cout << s.Base::m_B << endl;  //对象访问 通过作用域调用父类成员变量

   //第一个:: 代表 类名访问 第二个:: 代表 访问父类作用域下
    cout << Son::Base::m_A << endl;  //类名访问 通过作用域调用父类成员变量
    cout << Son::Base::m_B << endl;  //类名访问 通过作用域调用父类成员变量
    s.Base::fun();  //通过作用域调用父类成员函数
    Son::Base::fun();  //类名访问  通过作用域调用父类成员函数
}


http://www.ppmy.cn/news/1273548.html

相关文章

鸿蒙开发之用户隐私权限申请

一、简介 鸿蒙开发过程中可用于请求的权限一共有两种&#xff1a;normal和system_basic。以下内容摘自官网&#xff1a; normal权限 normal 权限允许应用访问超出默认规则外的普通系统资源。这些系统资源的开放&#xff08;包括数据和功能&#xff09;对用户隐私以及其他应用带…

17.Oracle中instr()函数查询字符位置

1、instr()函数的格式 &#xff08;俗称&#xff1a;字符查找函数&#xff09; 格式一&#xff1a;instr( string1, string2 ) // instr(源字符串, 目标字符串) 格式二&#xff1a;instr( string1, string2 [, start_position [, nth_appearance ] ] ) // instr(源字符…

MinIO客户端之alias

MinIO提供了一个命令行程序mc用于协助用户完成日常的维护、管理类工作。 官方资料 mc alias mc alias listmc alias removemc alias setmc alias importmc alias export 使用AK/SK创建一个新的别名&#xff0c;命令如下&#xff1a; ./mc alias set local http://192.168.0…

C#监听端口报错“以一种访问权限不允许的方式做了访问套接字的尝试”

C#编写的端口监听程序&#xff0c;平时都能正常运行&#xff0c;但最新操作系统更新补丁重启电脑后&#xff0c;运行程序报错“以一种访问权限不允许的方式做了访问套接字的尝试”&#xff0c;客户端程序也无法连接。   百度错误信息&#xff0c;给出的答案都是端口监听程序使…

重新认识Word——尾注

重新认识Word——尾注 参考文献格式文献自动生成器插入尾注将数字带上方括号将参考文献中的标号改为非上标 多处引用一篇文献多篇文献被一处引用插入尾注有横线怎么删除&#xff1f;删除尾注 前面我们学习了如何给图片&#xff0c;公式自动添加编号&#xff0c;今天我们来看看毕…

使用 ?? 重新定义逻辑以获得更严格、更安全的 JavaScript 默认值

使用 ?? 重新定义逻辑以获得更严格、更安全的 JavaScript 默认值 JavaScript 中的 ?? 运算符称为 nullish 合并运算符。该运算符接受任一侧的操作数&#xff0c;并且仅当左侧操作数为空值时才返回右侧操作数。这个运算符绝对是一个较新的运算符&#xff0c;它是在 ES2020 …

【STM32】STM32学习笔记-EXTI外部中断(11)

00. 目录 文章目录 00. 目录01. 中断系统02. 中断执行流程03. STM32中断04. NVIC基本结构05. NVIC优先级分组06. EXTI简介07. EXTI基本结构08. AFIO复用IO口09. EXTI框图10. 计数器模块11. 旋转编码器简介12. 附录 01. 中断系统 中断&#xff1a;在主程序运行过程中&#xff0…

87 GB 模型种子,GPT-4 缩小版,超越ChatGPT3.5,多平台在线体验

瞬间爆火的Mixtral 8x7B 大家好&#xff0c;我是老章 最近风头最盛的大模型当属Mistral AI 发布的Mixtral 8x7B了&#xff0c;火爆程度压过Google的Gemini。 缘起是MistralAI二话不说&#xff0c;直接在其推特账号上甩出了一个87GB的种子 随后Mixtral公布了模型的一些细节&am…