C++同名成员处理详解
1.知识总结
1.派生类对象可以直接访问到派生类中同名成员。
2.派生类对象加作用域可以访问到基类同名成员。
3.当派生类与基类拥有同名成员函数,派生类会屏蔽基类中同名成员函数,通过加作用域可以访问到基类的同名成员函数。
2.代码详解
1.同名成员变量处理
基类和派生类分别如下:
class Base {//基类
public:Base(){m_A = 10;//给基类成员m_A赋值为10}void fun(){cout << "Base-fun" << endl;}void fun(int A){cout << "Base-fun(A)" << endl;}int m_A;
};
class Son :public Base //public方式继承基类
{
public:Son(){m_A = 20;//与基类的成员名称相同}int m_A;void fun()//同名成员函数{cout << "Son-fun" << endl;}
从上图可以看出派生类中构造函数中 m_A=20,而基类构造函数中 m_A=10;
现在增加一个测试案例test01:
//测试案例一
void test01()
{Son s1;//直接访问派生类成员cout << "m_A: " << s1.m_A << endl;//加作用域可访问基类成员cout << "m_A: " << s1.Base::m_A << endl;
}
int main()
{test01();return 0;
}
运行结果如下
从图中可得知当派生类对象直接访问时,访问的是派生类的m_A,通过加作用域的方式可以访问到基类的m_A。
2.同名成员函数处理
基类和派生类的代码段中均含有fun()函数,那么派生类对象对它们的访问方式是怎样的呢?事实上,派生类对象对同名函数的访问方式与上面所讲的同名变量访问方式相同,都是通过加作用域的方式才能访问到基类成员。
增加一个测试案例test02
void test02()
{Son s1;s1.fun(); //直接访问为派生类的同名成员函数s1.Base::fun(); //同理需要加作用域才可访问基类的同名成员函数
}
int main()
{test02();return 0;
}
运行结果如下:
结果显而易见了。
对于同名函数还有一种情况:基类中的同名函数发生重载会怎样?
观察基类的代码段,发现其中有 fun() 的重载函数 fun(int),而派生类中没有,那么我们是否能直接访问fun(int)呢? 答案是:不能!
测试之后发现如果直接调用会出现“函数调用中参数太多的”错误,说明派生类中直接无法识别到fun(int)的存在,事实上,当派生类与基类拥有同名成员函数,派生类会屏蔽基类中同名成员函数,对于基类中的函数重载也不例外。这时,我们通过加作用域的方式就能完美解决了。
void test03()
{Son s1;s1.Base::fun(0);
}
总结:
派生类对象可以直接访问派生类同名成员,通过加作用域访问基类同名成员。
C++同名成员处理详解相关推荐
- C++ 类中数据成员分布详解
概述 我们都知道类中包含着数据成员,但是数据成员在内存中是怎样分布的呢?继承之后数据又是怎样布局的呢?下面对这些问题进行整理解答.首先说明的是类的空间分布是编译器编译的结果,不同的编译器有可能会不一样 ...
- c++中类的构造函数的初始化成员列表详解
昨天傍晚在阅读OpenCV的程序时看到代码如下: inline Mat::Mat() : size(&rows) { initEmpty(); } 第一行中单冒号及其后边的内容我完全不 ...
- 【OpenCV3】cv::Mat类成员函数详解
cv::Mat为OpenCV2和OpenCV3中最重要的类,可以毫不夸张得说,掌握了cv::Mat的操作,就掌握了OpenCV大半,这里将详细的介绍下cv::Mat类的成员函数及其使用. 1.clon ...
- CString类所有成员函数详解
VC里CString是我们最常用的类之一,我们觉得对它很熟悉了,可是你知道它的所有用法吗? 还是系统的学习一下吧,认真看完本文就OK了. 下面开始: CString::Compare int Comp ...
- STL vector成员函数详解
一. 常用简单成员函数 vector::push_back(Type val) //将val添加到向量尾部 vector::pop_back() //将最后一个元素删除 iterator vector ...
- C++常对象,常变量,常成员函数详解(含添加内容)
既要使数据能在一定范围内共享,又要保证它不被任意修改,可使用const. · 用const修饰的声明数据成员称为常数据成员 · 用const修饰的声明成员函数称为常成员函数 ...
- 【C++】类的6个默认成员函数详解
- 继承关系中构造函数、析构函数的调用顺序详解
构造函数: 在c++中,当声明一个派生类的对象时,派生类中包含所有父类的数据成员以及自己添加的数据成员均已被分配了内存,只是尚未进行初始化配置(但实际上基本数据类型的变量已经被赋予随机默认值). 构造 ...
- C++继承详解之四——is-a接口继承和has-a实现继承
在学习继承的过程中,不管是在书中还是在网上找资料,都跟多态分不开,其中还有个很抓人眼球的问题,那就是书上总是说的is-a关系和has-a关系. 很多书中讲到继承时都会说: public继承是一个接口继 ...
最新文章
- Protobuf windows
- avalov+require实现tab栏
- 20145309信息安全系统设计基础第3周学习总结
- 让你的照片更鲜艳------hsv拉伸
- 活动目录.NET编程Tips
- 华为交换机—RRPP协议
- JS正则表达式验证数字非常全
- Citrix VDI-in-a-Box 第二篇:架构篇
- C++实现各种排序以及复杂度,稳定性分析
- LeetCode1. 两数之和
- 使用C#和MSMQ开发消息处理程序
- 【lucene】lucene 高级搜索
- 【To Do】LeetCode 142. Linked List Cycle II
- 什么是.NET应用程序域
- Pandas的read_excel()函数读取excel时遇到身份证含空值(pandas识别nan为float类型)自动变成科学计数法的解决办法
- python-pygame作品之MineCraft小鸡
- 喵的Unity游戏开发之路 - 推球:游戏中的物理
- 【2019春招】平安科技开发实习生面经
- python灰色波浪线_去除pycharm的波浪线
- latch:cache buffers chains
热门文章
- c语言 常量表达式,C++11 constexpr:验证是否为常量表达式(长篇神文)
- c语言 update函数,feupdateenv
- SpringBoot整合Sharding-JDBC通过标准分片策略(Standard)实现分表操作
- 基于django的个人博客设计与实现设计与实现-计算机毕业设计源码+LW文档
- 【蓝桥杯】 C++ 试题 基础练习 十进制转十六进制
- 喜迎华诞,openEuler 22.09 正式发布,与1265名开发者共建面向数字基础设施的开源操作系统
- android仿三星I900滑动解锁
- html5 audio设置currentTime
- 教你如何使用 chmod 命令
- DNS区域传输、DNS自动枚举工具dnsrecon