C++子类对象隐藏了父类的同名成员函数(隐藏篇)
https://blog.csdn.net/alpha_love/article/details/75222175
#include <stdlib.h>
#include <string>
using namespace std;
/**
* 定义人类: Person
* 数据成员: m_strName
* 成员函数: attack()
*/
class Person
{
public:
Person()
{
cout<<"Person()"<<endl;
}
Person(const Person& p)
{
cout<<"Person(const Person& p)"<<endl;
}
string m_strName;
void attack()
{
cout << "attack" << endl;
}
};
/**
* 定义士兵类: Soldier
* 士兵类公有继承人类
* 数据成员: m_strName
* 成员函数: attack()
*/
class Soldier:public Person
{
public:
Soldier()
{
cout<<"Soldier()"<<endl;
}
string m_strName;
void attack()
{
cout << "fire!!!" << endl;
}
};
int main(void)
{
// 实例士兵对象
Soldier soldier;//实例化子类,会先调用基类构造函数,再调用子类的构造函数,析构时,则相反,先析构子类的,再析构基类的
Person p = soldier;//可以看出子类的对象可以初始化基类的对象,并且这种方式会调用基类的拷贝构造函数
// 向士兵属性赋值"tomato"
soldier.m_strName = "tomato";
// 通过士兵对象向人类属性赋值"Jim"
soldier.Person::m_strName = "Jim";
// 打印士兵对象的属性值
cout << soldier.m_strName << endl;
// 通过士兵对象打印人类属性值
cout << soldier.Person::m_strName << endl;//注意这种使用子类的对象调用基类成员变量的方式
// 调用士兵对象方法
soldier.attack();
// 通过士兵对象调用人类方法
soldier.Person::attack();//注意这种使用子类的对象调用基类的成员函数的方式
return 0;
}
输出结果:
Person() Soldier() Person(const Person& p) tomato Jim fire!!! attack
通过上面的例子,对于基类和子类之间的特性可以做如下的总结:
(1)当子类中含有和基类同名的成员变量时,再用子类的对象调用该同名成员变量时,将只会调用到子类自身定义的成员变量,而不会调用到基类的同名成员变量,这种现象就叫做隐藏,子类把基类的同名成员变量隐藏了,正确调用方式如上面例子中橘色字体部分:soldier.Person::m_strName;
(2)当子类中含有和基类同名的成员函数时,再用子类的对象调用该同名成员函数时,将只会调用到子类自身定义的成员函数,而不会调用到基类定义的同名的成员函数,这也是因为子类把基类的同名成员函数隐藏了;正确调用方法应该是如上面例子中橘色字体部分:soldier.Person::attack();
这里要强调的是何为同名成员函数,即不管参数是否相同、返回值是否相同,只要函数名称相同,就是同名成员函数,如果子类和基类定义了这样的函数,子类就会把基类的相应函数隐藏掉。在上面的例子中加入我们在基类Person的attack()函数里面添加参数int x,这个时候用soldier.attack(5)这种方式试图调用基类的attack()仍然会报错,是调用不到的。
C++子类对象隐藏了父类的同名成员函数(隐藏篇)相关推荐
- python重点知识 钻石_python——子类对象如何访问父类的同名方法
1. 为什么只说方法不说属性 关于"子类对象如何访问父类的同名属性"是没有意义的.因为父类的属性子类都有,子类还有父类没有的属性,在初始化时,给子类对象具体化所有的给定属性,完全没 ...
- 子类与父类的同名成员调用和注意事项
class Father {//父类 public:Father() {a = 100;}void func() {cout << "father::func()" & ...
- C++ - 子类与父类的同名成员变量
1.思考 子类中是否可以定义父类中的同名成员?如果可以,如何区分?如果不可以,为什么? 代码示例: #include <iostream> #include <string>u ...
- 浅谈将子类对象赋值给父类对象
最近对将子类对象赋值给父类对象有点心得,想和大家分享一下,但本人水平有限,请各位指正和批评.言归正传,下面是几个小例子,请大家看一看. 测试一 父类: public class Supclass {p ...
- 父类指针指向子类实例,用父类指针调用虚函数,调用的是子类的函数还是父类的函数...
父类指针指向子类实例,用父类指针调用虚函数,调用的是子类的函数还是父类的函数 以下程序的显示结果是什么,为什么 #include <iostream> using namespace st ...
- Java中子类对象赋值给父类变量
1. 在Java中将一个字类对象赋值给父类变量是合法的,这也是实现多态(即方法的动态分派)的前提条件之一. 2. 在Java中父类赋值同样也适用于数组.可以将一个子类数组赋值给一个父类数组变量.但可能 ...
- 子类内部调用父类成员函数,及子类对象在外部调用父类成员函数问题(C++)
先看段程序: #include <iostream>using namespace std;class A {private:void f(){cout << "pr ...
- 41_C++_试定义类 TR1(三角形)及其派生类 COL(三角柱体)其中三角形类可以计算三角形的面积和周长; 三角柱体类可以计算柱体的体积和表面积【难点:子类初始父类私有成员、子类对象赋值给父类】
题目: 被卡住过的地方 1. 子类的有参构造,初始化父类的私有成员 TRI父类的有参构造TRI(double x1, double y1, double z1){x = x1;y = y1<
- 同一类的不同对象,在调用相同的成员函数时,入口地址是相同的
一般成员函数的第一个参数默认是this(可以不写),this指针指向调用这个函数的对象,所以可以给函数传入不同的参数,输出不同的值,而且互不影响. 但是静态成员函数没有this指针. 定义的对象,编译 ...
最新文章
- uniapp原生子窗体(弹出层为例子)
- 监听iPhone的通话状态之---CoreTelephony.framework
- 模拟人生4修改服务器,【M4分享】PS4主机版模拟人生4的作弊码
- SSIS的文件系统任务实例(zz)
- visual studio可以开发app吗_个人能开发App软件吗?从想法到App开发完成,我只用了三天...
- python 把多个list合并为一个并去重内容_110道Python面试题(上)
- a5 1c语言实现,初识C语言1_qq5fb3b05a5f322的技术博客_51CTO博客
- 在虚拟机中配置FastDFS+Nginx模块
- java方法栈和c方法栈_Java虚拟机:本地方法栈与Native方法
- Debian8.8开发环境(五)vim设置文件和vunlde的配置
- Go sqlx 框架使用下划线命名法处理结构体字段
- Visio2013 补丁
- html网页配色,#0000ff表示什么颜色,设计师谈网页配色:按颜色分类(黄色)
- 【java】BeanUtils.populate()的使用
- php wx.downloadimage,大神,wx.downloadImage 图片过期问题
- OpenLayer仿天地图多时相
- MPU6050加速度传感器学习笔记之传感器
- 椭圆曲线介绍(四):椭圆曲线安全性,与RSA对比
- 如何批量获取企业工商信息?
- 【360安全浏览器】强效广告过滤推荐
热门文章
- How to fix the bug “Expected required, optional, or repeated.”?
- Java访问权限的范围
- python ATM购物程序
- 代码分享h5-sessionStorage,提示app下载代码块
- (扩展)欧几里德快速幂
- 逝去的大学生活自己丢了什么
- MySQL使用学习使用,mysql学习--基本使用_MySQL
- turtle 函数 方法_学python第十一节:turtle深入 了解
- oracle11g日志原理,oracle11gRAC之log日志体系
- 混频通信的matlab仿真,基于MATLAB的扩频通信系统仿真研究—上海交通大学