https://blog.csdn.net/alpha_love/article/details/75222175

#include <iostream>
#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++子类对象隐藏了父类的同名成员函数(隐藏篇)相关推荐

  1. python重点知识 钻石_python——子类对象如何访问父类的同名方法

    1. 为什么只说方法不说属性 关于"子类对象如何访问父类的同名属性"是没有意义的.因为父类的属性子类都有,子类还有父类没有的属性,在初始化时,给子类对象具体化所有的给定属性,完全没 ...

  2. 子类与父类的同名成员调用和注意事项

    class Father {//父类 public:Father() {a = 100;}void func() {cout << "father::func()" & ...

  3. C++ - 子类与父类的同名成员变量

    1.思考 子类中是否可以定义父类中的同名成员?如果可以,如何区分?如果不可以,为什么? 代码示例: #include <iostream> #include <string>u ...

  4. 浅谈将子类对象赋值给父类对象

    最近对将子类对象赋值给父类对象有点心得,想和大家分享一下,但本人水平有限,请各位指正和批评.言归正传,下面是几个小例子,请大家看一看. 测试一 父类: public class Supclass {p ...

  5. 父类指针指向子类实例,用父类指针调用虚函数,调用的是子类的函数还是父类的函数...

    父类指针指向子类实例,用父类指针调用虚函数,调用的是子类的函数还是父类的函数 以下程序的显示结果是什么,为什么 #include <iostream> using namespace st ...

  6. Java中子类对象赋值给父类变量

    1. 在Java中将一个字类对象赋值给父类变量是合法的,这也是实现多态(即方法的动态分派)的前提条件之一. 2. 在Java中父类赋值同样也适用于数组.可以将一个子类数组赋值给一个父类数组变量.但可能 ...

  7. 子类内部调用父类成员函数,及子类对象在外部调用父类成员函数问题(C++)

    先看段程序: #include <iostream>using namespace std;class A {private:void f(){cout << "pr ...

  8. 41_C++_试定义类 TR1(三角形)及其派生类 COL(三角柱体)其中三角形类可以计算三角形的面积和周长; 三角柱体类可以计算柱体的体积和表面积【难点:子类初始父类私有成员、子类对象赋值给父类】

    题目: 被卡住过的地方 1. 子类的有参构造,初始化父类的私有成员 TRI父类的有参构造TRI(double x1, double y1, double z1){x = x1;y = y1<

  9. 同一类的不同对象,在调用相同的成员函数时,入口地址是相同的

    一般成员函数的第一个参数默认是this(可以不写),this指针指向调用这个函数的对象,所以可以给函数传入不同的参数,输出不同的值,而且互不影响. 但是静态成员函数没有this指针. 定义的对象,编译 ...

最新文章

  1. uniapp原生子窗体(弹出层为例子)
  2. 监听iPhone的通话状态之---CoreTelephony.framework
  3. 模拟人生4修改服务器,【M4分享】PS4主机版模拟人生4的作弊码
  4. SSIS的文件系统任务实例(zz)
  5. visual studio可以开发app吗_个人能开发App软件吗?从想法到App开发完成,我只用了三天...
  6. python 把多个list合并为一个并去重内容_110道Python面试题(上)
  7. a5 1c语言实现,初识C语言1_qq5fb3b05a5f322的技术博客_51CTO博客
  8. 在虚拟机中配置FastDFS+Nginx模块
  9. java方法栈和c方法栈_Java虚拟机:本地方法栈与Native方法
  10. Debian8.8开发环境(五)vim设置文件和vunlde的配置
  11. Go sqlx 框架使用下划线命名法处理结构体字段
  12. Visio2013 补丁
  13. html网页配色,#0000ff表示什么颜色,设计师谈网页配色:按颜色分类(黄色)
  14. 【java】BeanUtils.populate()的使用
  15. php wx.downloadimage,大神,wx.downloadImage 图片过期问题
  16. OpenLayer仿天地图多时相
  17. MPU6050加速度传感器学习笔记之传感器
  18. 椭圆曲线介绍(四):椭圆曲线安全性,与RSA对比
  19. 如何批量获取企业工商信息?
  20. 【360安全浏览器】强效广告过滤推荐

热门文章

  1. How to fix the bug “Expected required, optional, or repeated.”?
  2. Java访问权限的范围
  3. python ATM购物程序
  4. 代码分享h5-sessionStorage,提示app下载代码块
  5. (扩展)欧几里德快速幂
  6. 逝去的大学生活自己丢了什么
  7. MySQL使用学习使用,mysql学习--基本使用_MySQL
  8. turtle 函数 方法_学python第十一节:turtle深入 了解
  9. oracle11g日志原理,oracle11gRAC之log日志体系
  10. 混频通信的matlab仿真,基于MATLAB的扩频通信系统仿真研究—上海交通大学