`
mquv_site
  • 浏览: 39411 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

C++学习-继承中的作用域(10)

 
阅读更多
作者:gzshun. 原创作品,转载请标明出处!
来源:http://blog.csdn.net/gzshun


在继承过程中,从基类派生出派生类,可能出现重名的成员,包括数据成员或成员函数,这些属于作用域方面的内容。

一、基类的引用或指针访问派生类

基类的引用或指针只能访问派生类中属于基类的部分成员,不能访问派生类的部分,否则就会编译出错。


执行结果:

调用基类的成员函数
调用基类的成员函数
调用派生类的成员函数


二、重复的数据成员
有时基类和派生类有同名的数据成员,甚至可能在基类和间接基类中都有同名的数据成员。
这种情况一般会出现在:从 由另一个程序员创建的基类中派生自己的类,可能不知道在基类中有什么私有数据成员,此时自己又创建了与基类当中同名的数据成员。
当然这种情况是不会阻碍继承的,编译器做了很多的工作。但这里主要是介绍如何从派生类中调用派生类的同名私有成员或者基类的私有成员。
例子:
CBase是CDerived的父类,它们拥有一个同名成员为mVal。
在派生类中
1.默认是访问自己的数据成员mVal;
2.若要访问基类的mVal,要用这种格式"<类名>::<数据成员>", CBase::mVal


执行结果:

犀利爹的年龄:120
犀利哥的年龄:100


三、重复的成员函数
基类与派生类若存在重复的成员函数,则有2种情况:
第一种情况:函数名相同,参数列表不同,如果将基类的成员函数的作用域引入派生类中,就是重载版本了
第二种情况:函数的所有方面都相同,包括函数名,参数列表与返回值

第一种情况:
函数名相同,参数列表不同,这跟函数的重载一样。但这并不是函数的重载,因为函数的重载必须在同一个作用域中定义,而基类和派生类定义了不同的作用域。在这里,可以使用using在派生类中声明基类的函数,将基类的函数的作用域引入派生类中的作用域,让这里的函数成为重载版本,来个小例子。


执行结果:

调用派生类的打印函数: val = 2
调用基类的打印函数: str = hello


这里如果没有"using CBase::Print;"的声明,那么将会编译错误。

第二种情况:

函数的所有方面都相同,包括函数名,参数列表与返回值,在派生类中,要调用基类的同名成员函数,方法跟同名数据成员的方法一样,格式是:"<类名>::<成员函数>"。


执行结果:

调用派生类的成员函数
调用基类的成员函数


四、虚函数的作用域
关于虚函数的内容,就会涉及到动态绑定的知识了,这里先不介绍,主要还是说明类继承的作用域的问题。在类的继承过程中,基类中的成员函数是不是虚函数,将会起着非常大的作用,先来看2个虚函数的例子。
1.在基类中没有使用virtual关键字


执行结果:

调用CBase::Print()
调用CBase::Print()
调用CBase::Print()


2.在基类中使用virtual关键字


执行结果:

调用CBase::Print()
调用CDerived1::Print()
调用CDerived2::Print()


1,2两个例子可以看到,一个virtual的关键字起着这么大的作用。当基类的成员函数使用virtual关键字修饰的话,基类指针会根据指向的对象的实际类型来寻找相应的类的成员函数的定义。要获得动态绑定,必须通过基类的引用或指针调用虚成员。
在第二个例子中,将Print函数声明为虚函数,这样子编译器会生成代码,在运行时基于引用或指针所绑定的对象的实际类型进行调用。bp2指向CDerived1对象,bp3指向CDerived2对象,所以都是调用属于自己的Print函数版本。


分享到:
评论

相关推荐

    C++名称空间与作用域

    很好的一本C++较少名称空间和作用域的书籍,让你更加了解名称空间的机制。。。。

    C++大学教程

    1.13 C++与本书的一般说明----------------------------------------------10 1.14 C++编程简介------------------------------------------------------11 1.15 简单程序:打印一行文本----------------------...

    c++继承与派生习题答案

    在派生类中采用虚基类或作用域分辨符来消除该问题。 2.简答题 2.1 派生类可以通过使用基类的指针或引用来实现对基类私有成员的访问。 2.2 类型兼容规则是指在c++中,派生类可以兼容基类的类型,从而实现多态性。...

    《由浅入深学C++-基础、进阶与必做300题》pdf格式 (完整版 带目录

    本书循序渐进地讲述了C++的基础知识、C++程序的组成及其开发过程、C++程序中的数据、表达式和语句、控制程序流程、数组与字符串、指针与引用、使用函数、函数模板、错误和异常处理、宏和预编译、面向对象的开发、...

    黄邦勇帅C++专题讲解

    C++名称空间与作用域专题 C++类中的各种成员,嵌套类,友元,this指针专题 C++继承,虚函数与多态性专题 C++宏,预处理器,RTTI,typeid与强制类型转换专题 C++函数专题 C++构造函数,复制构造函数和析构函数专题 C++的...

    清华大学计算机课程之《C++程序设计》

    - 第六节 变量的作用域与存储期 - 第七节 函数的重载 - 第八节 程序举例 - 本章小结 - 课后习题 ◇ 第六章 数组与字符串 - 课前索引 - 第一节 一维数组 - 第二节 二维数组 - 第三节 字符数组 - 第四节 ...

    c++精粹c++精粹c++精粹c++精粹

    本书介绍了C++的程序结构、词法符号、常量、声明及作用域规则、文件链接规则、类型、类型转换、表达式及运算符、语句、函数、类、继承、模板、异常、输入/输出、STL、字符串库等方面的内容。特别是标准模板库(STL...

    C++程序设计复习笔记.doc

    C++程序设计是计算机科学和信息技术中的一个重要组成部分,它是C语言的继承和发展。C++程序设计是强类型语言,要求在使用数据之前必须对数据的类型进行声明。以下是C++程序设计的重要知识点: 一、数据类型 * 保留...

    C++ 语法详解

    C++整型、字符型、浮点型、声明、定义、typedef、运算符、表达式、左值、选择语句、循环语句、指针、数组、函数和标识符的作用域、类基础、类作用域及相关运算符、构造函数、复制构造函数、析构函数、名称空间、类中...

    C++ Primer第四版【中文高清扫描版】.pdf

    17.3.4 多重继承下的类作用域 620 17.3.5 虚继承 622 17.3.6 虚基类的声明 624 17.3.7 特殊的初始化语义 625 小结 628 术语 628 第18章 特殊工具与技术 631 18.1 优化内存分配 632 18.1.1 C++中的内存分配 632 ...

    鸡啄米:C++编程入门系列

    鸡啄米:C++编程入门系列之四十一(继承与派生:作用域分辨符) 鸡啄米:C++编程入门系列之四十二(继承与派生:虚基类及其派生类 的构造函数) 鸡啄米:C++编程入门系列之四十三(继承与派生:赋值兼容规则) ...

    Visual C++ 2005入门经典--源代码及课后练习答案

    2.7 了解存储时间和作用域 76 2.7.1 自动变量 77 2.7.2 决定变量声明的位置 79 2.7.3 全局变量 79 2.7.4 静态变量 82 2.8 命名空间 83 2.8.1 声明命名空间 84 2.8.2 多个命名空间 86 2.9 C++/CLI...

    Absolute C++中文版(原书第2版)-完美的C++教程,文档中还包含英文版

    3.3.5 嵌套作用域 85 3.3.6 for循环中声明的变量 85 第4章 参数与重载 92 4.1 参数 92 4.1.1 传值调用参数 92 4.1.2 引用调用参数初步 94 4.1.3 引用调用机制详解 95 4.1.4 常量引用参数 97 4.1.5 混合参数...

    c.c++找工作面试重点结构图-mindmanager

    控制方式 访问声明采用作用域"::" ,它的一般形式为:基类名::成员名;。在派生类的类界面中,将这些访问声明放在合适的访问控制保留字之后,从而改变在派生类中该成员的访问控制方式。 重定义 如果在派生类中定义了...

    C++ Qt设计模式(第2版)

    C++ Qt设计模式(第2版)是美国萨福克大学已使用十余年的经典教程,利用跨平台开源软件...第20章 作用域与存储类 416 第21章 内存访问 431 第22章 继承详解 443 第三部分 编 程 作 业 第23章 MP3自动点唱机作业 456

    《C++面向对象程序设计》的源码

    第4、5章详细介绍常量及变量的生存期与作用域;第7、8章详细讲解类的继承、组合、多态及模板问题;第9、10、11章详细介绍I/O流、异常处理及Visual C++ 2008环境;最后给出一个综合实例。书中还配有大量的习题。本书...

    google C++ 风格指南 - 中文版

    2. 作用域 2.1. 名字空间 2.1.1. 匿名名字空间 2.1.2. 具名的名字空间 2.2. 嵌套类 2.3. 非成员函数, 静态成员函数, 和全局函数 2.4. 局部变量 2.5. 静态和全局变量 译者 (YuleFox) 笔记 3. 类 3.1. 构造函数...

    C++ Primer中文版(第5版)李普曼 等著 pdf 1/3

     15.6 继承中的类作用域 547  15.7 构造函数与拷贝控制 551  15.7.1 虚析构函数 552  15.7.2 合成拷贝控制与继承 552  15.7.3 派生类的拷贝控制成员 554  15.7.4 继承的构造函数 557  15.8 容器与继承 558  ...

    深度探索C++对象模型 chm

    但是要注意因为分配在堆中的对象没有作用域的限制,因此一旦new了它,必须delete它,否则程序将崩溃,这便是内存泄漏。(C#已经通过内存托管解决了这一令人头疼的问题)。C++通过new来分配内存,new的参数是一个...

Global site tag (gtag.js) - Google Analytics