如果派生类中的成员(包括成员变量和成员函数)和基类中的成员重名,那么就会遮蔽从基类继承过来的成员。所谓遮蔽,就是在派生类中使用该成员(包括在定义派生类时使用,也包括通过派生类对象访问该成员)时,实际上使用的是派生类新增的成员,而不是从基类继承来的。

成员函数的名字遮蔽:

#include<iostream>
using namespace std;//基类People
class People{public:void show();
protected:char *m_name;int m_age;
};
void People::show(){cout<<"嗨,大家好,我叫"<<m_name<<",今年"<<m_age<<"岁"<<endl;
}//派生类Student
class Student: public People{public:Student(char *name, int age, float score);
public:void show();  //遮蔽基类的show()
private:float m_score;
};
Student::Student(char *name, int age, float score){m_name = name;m_age = age;m_score = score;
}
void Student::show(){cout<<m_name<<"的年龄是"<<m_age<<",成绩是"<<m_score<<endl;
}int main(){Student stu("小明", 16, 90.5);//使用的是派生类新增的成员函数,而不是从基类继承的stu.show();//使用的是从基类继承来的成员函数stu.People::show();return 0;
}

运行结果:

小明的年龄是16,成绩是90.5
嗨,大家好,我叫小明,今年16岁

本例中,基类 People 和派生类 Student 都定义了成员函数 show(),它们的名字一样,会造成遮蔽。第 37 行代码中,stu 是 Student 类的对象,默认使用 Student 类的 show() 函数。

但是,基类 People 中的 show() 函数仍然可以访问,不过要加上类名和域解析符,如第 39 行代码所示。

基类成员函数和派生类成员函数不构成重载

基类成员和派生类成员的名字一样时会造成遮蔽,这句话对于成员变量很好理解,对于成员函数要引起注意,不管函数的参数如何,只要名字一样就会造成遮蔽。换句话说,基类成员函数和派生类成员函数不会构成重载,如果派生类有同名函数,那么就会遮蔽基类中的所有同名函数,不管它们的参数是否一样。

下面的例子很好的说明了这一点:

#include<iostream>
using namespace std;//基类Base
class Base{public:void func();void func(int);
};
void Base::func(){ cout<<"Base::func()"<<endl; }
void Base::func(int a){ cout<<"Base::func(int)"<<endl; }//派生类Derived
class Derived: public Base{public:void func(char *);void func(bool);
};
void Derived::func(char *str){ cout<<"Derived::func(char *)"<<endl; }
void Derived::func(bool is){ cout<<"Derived::func(bool)"<<endl; }int main(){Derived d;d.func("c.biancheng.net");d.func(true);d.func();  //compile errord.func(10);  //compile errord.Base::func();d.Base::func(100);return 0;
}

本例中,Base 类的func()、func(int)和 Derived 类的func(char *)、func(bool)四个成员函数的名字相同,参数列表不同,它们看似构成了重载,能够通过对象 d 访问所有的函数,实则不然,Derive 类的 func 遮蔽了 Base 类的 func,导致第 26、27 行代码没有匹配的函数,所以调用失败。

如果说有重载关系,那么也是 Base 类的两个 func 构成重载,而 Derive 类的两个 func 构成另外的重载。

C++继承时名字的遮蔽相关推荐

  1. Java继承时构造函数的关系

    Java继承时构造函数的关系,先来一道笔试题给大家看看: 在继承中,关于构造方法的说明,下列说法错误的是() A.子类无条件的继承父类的无参构造方法, B.子类可以引用父类中的有参构造方法,使用sup ...

  2. C++虚继承时的构造函数

    在虚继承中,虚基类是由最终的派生类初始化的,换句话说,最终派生类的构造函数必须要调用虚基类的构造函数.对最终的派生类来说,虚基类是间接基类,而不是直接基类.这跟普通继承不同,在普通继承中,派生类构造函 ...

  3. C++多继承时的对象内存模型

    #include <cstdio> #include <iostream> using namespace std; //基类A class A{ public:A(int a ...

  4. c++远征之继承篇——多重继承,多继承,虚继承,多继承时的重复定义解决方法

    以下内容源于慕课网的学习整理,如有侵权,请告知删除. 1.多重继承 (1)概念理解 2.多继承 (1)概念理解 3.虚继承 (1)问题的引出:多重继承和多继承的结合,造成数据的冗余.     (2)解 ...

  5. C++继承时的一些细节知识点

    编译器只有在一个类中没有一个构造函数的时候自动生成默认构造函数,当类中有任何一个类的时候,系统便不会再生成默认构造函数. 基类的成员变量在派生类中不可直接访问,但可以以间接访问,例如通过调用基类的成员 ...

  6. C++ 论公有继承时纯虚函数、虚函数、普通函数的行为表现及虚函数的重写(深度好文)

    文章目录 1 公有继承时三种类型的函数行为 1.1 纯虚函数 (pure virtual) 1.2 普通虚函数 **1.2.1 方法一** **1.2.2 方法二** 1.3 非虚函数 2 重写 (o ...

  7. python3 多继承时,父类有相同一个函数的选择

    class People:name = ''age = 0__weight = 0def __init__(self, name, age, weight):print("People 初始 ...

  8. php继承时父类与子类构造函数的优先问题

    php类在继承时父类与子类构造函数的优先问题可以归纳如下: 父类有构造函数,子类没有,在实例化子类时,会调用父类构造方法, 父类有构造函数,子类也有,在实例化子类时,会调用子类构造方法, <?p ...

  9. C++类继承时构造函数与析构函数的执行顺序

    C++类继承时构造函数与析构函数的执行顺序 在C++类中,类A继承类B时,如果创建一个A的对象时,会首先调用基类的构造函数,再调用派生类的构造函数,而析构函数的执行相反,但是当基类和派生类分别有一个成 ...

最新文章

  1. python中lambda 表达式(无参数、一个参数、默认参数、可变参数(*args、**kwargs)、带判断的lambda、列表使用lambda)
  2. DRBD + heartbeat 介绍及安装测试
  3. 使用DBLINK为远程数据库的用户表创建同义词
  4. 学习Caffe(二)使用Caffe:Caffe加载模型+Caffe添加新层+Caffe finetune
  5. 声速的测量的实验原理和应用_声速的测定实验报告心得体会
  6. 开源应用架构之asterisk
  7. Duplicate interface definition for class
  8. 一个故事理解什么是接口回调
  9. 基于爬虫制作的Python翻译程序
  10. [学习][记录] c++语言:从放弃到入门 <一> c++11新关键字以及引入的新特性
  11. 计算机和网络邻居都不见 了,网上邻居看不到自己和别人电脑怎么办
  12. PyCharm取消波浪线、下划线和中划线
  13. 文本乱码怎么办?教你一招批量修改文本文件的编码格式,轻松解决乱码问题
  14. 每天读一点职场心理学读书笔记
  15. SQL Server2012 复习
  16. 解决java编译错误( 程序包javax.servlet不存在javax.servlet.*)
  17. 有源晶振和无源晶振的比较
  18. 网络应用技术之网络层
  19. 天宇优配|A股迎来“重要转折” 私募机构投资信心与仓位同步走高
  20. fio -enghelp中没有rbd、rados引擎解决方法

热门文章

  1. pointnet分割自己的点云数据_细嚼慢咽读论文:PointNet论文及代码详细解析
  2. java actionscript_ActionScript(对比Java)学习笔记二
  3. redis续期_面试官:Redis分布式锁如何解决锁超时问题的?
  4. win7系统电脑运行速度的提升方法
  5. Android平台使用Camera2(5.0+)替代过时的Camera
  6. Easyui+Spring+Mybatis完整示例(后台)
  7. java自定义注解实现日志功能
  8. 不删除旧版本java_Linux 卸载旧版jdk 并安装新版jdk(转)
  9. 如何启动netcat_Netcat用法
  10. html转word 图片丢失 java_Java 设置 Word 文档中图片文字环绕方式