新用户注册 | 会员登录
登录 极速注册
取消
热门标签 | HotTags
当前位置:   开发笔记 > 编程语言 > 正文

C++学习笔记(13)——利用对象、引用、指针调用虚函数

本博客(http:blog.csdn.netlivelylittlefish)贴出作者(三二一、小鱼)相关研究、学习内容所做的笔记,欢迎广大朋友指正!
本博客(http://blog.csdn.net/livelylittlefish)贴出作者(三二一、小鱼)相关研究、学习内容所做的笔记,欢迎广大朋友指正!                                  

利用对象、引用、指针调用虚函数 

                                       虚函数实现原理说明:
                             在“C++学习笔记(12)——多态与虚函数 ”中,每个类的大小比起所有成员数据多4个字节,表明有虚函数的类的大小还要加上一个紧缩的空指针类型的大小。这说明了该在包含虚函数的类中,编译系统自动加入了一些表明类型的信息。
  当一个类中拥有虚函数时,编译系统将为该类创建一个数组VTABLE。VTABLE的元素是虚函数的地址,且同一虚函数的地址在基类和派生类的VTABLE中相对首位置的偏移是一样的。同时,编译系统还加入了相应的调用虚函数的代码。所有这些都是不需要程序员作的工作,由系统自动完成。在初始化该类对象时,将加入一个指向VTABLE的指针,这个指针一般称为VPTR。一般来说,VPTR位于该类对象的存储单元的最开始部位。
                           
  这样,当VPTR被正确的初始化之后,便指向了该对象的VTABLE,从而在对象及其特定的虚函数定义间建立了联系。从虚函数调用的意义上来说,VPTR表明了类型信息,因为它使得调用与类型相符合。
          本例(见下文)可以看到,不管类层次进行了多少扩充,对于已有类对象的操作都不必作出改动。从这一点来看,虚函数所体现的运行时多态,大大提高了软件的可扩充性。我们知道,系统的设计者在初期集中于整个系统框架的合理构建,而在后期进行具体问题的分析,并逐渐扩充该框架。运行时多态保证了分析、设计、实现和扩充各个阶段的统一,使得系统的设计者在各阶段可以集中于眼前的工作,而不必为了以后不可预见的变化付出代价。   虚函数总结:
              虚函数只能是类成员函数,它在基类体内部说明,目的是提供一种接口界面;
       虚函数不能是友元函数(即非成员函数),也不能是静态成员函数,因为虚函数调用要靠特定的对象来决定该激活哪个函数。虚函数可以在另一个类中被声明为友元函数;
   一旦一个函数定义为虚函数,那么无论它传下多少层,都将保持为虚函数,而不必每次都加关键字virtual;
                            基类的虚函数可在一个或多个派生类中被重新定义,但其原型与基类必须完全相同(即返回类型、函数名、参数个数、类型及顺序一样),否则系统将认为派生类中的函数是重载的,而非虚函数;如果仅有返回类型不同,那么编译将出错;                               要虚函数发挥作用,必须用基类的指针(或引用)指向派生类的对象,并用指针(或引用)调用虚函数。也就是说,只有用地址才能体现运行多态性。因为不论是指向基类还是指向派生类的指针(引用),大小都是一样的,这样才能用基类指针指向派生类对象。这时,指针提供的信息是不完全的,在编译阶段不知道应该调用虚函数的哪个版本。而如果用对象调用虚函数,由于类型已经确定了,因此编译系统很可能采用预绑定;                                                           由于包含虚函数的基类指针可以指向其不同的派生类,并可执行不同版本的虚函数,提供了实现程序运行的多态性方法,因而将包含虚函数的类称为多态类。                     虚函数与一般重载函数的区别:
                                      重载函数在类型和参数数量上一定不相同,而重定义的虚函数则要求参数的类型和个数、函数返回类型相同;
   虚函数必须是类的成员函数,重载的函数则不一定是这样;
   构造函数可以重载,但不能是虚函数,析构函数可以是虚函数。
                      指针的转换规则:
                                指向基类的指针,可以指向它的公有派生的对象,但不能指向私有派生的对象;
   只能利用它直接访问派生类从基类继承来的成员,不能直接访问公有派生类中特定的成员;
   不能将指向派生类对象的指针指向其基类的一个对象。
                                     当虚函数在操作中引用的基类数据成员无法被派生类直接引用时(例如被隐藏的成员),便会出现错误。为了使用虚函数达到最好的动态联编效果,一般应以该虚函数第一次出现的类的引用体或指针作为参数,避免不确定因素。                                                 

代码如下:

                            /************************************************************************
* 利用对象、引用、指针调用虚函数
***********************************************************************
*/

#include 
<IOSTREAM.H>
//基类
class CBase
{
    
int x;
public:
    CBase(
int n) {x=n;}
    
virtual void PrintX() {cout<<"CBase::PrintX : "<<x<<endl;}
}
;

//派生类
class CDerive : public CBase
{
    
int x;
public:
    CDerive(
int n1,int n2):CBase(n1) 
{    x=n2;    }
    
void PrintX() 
    
{    cout<<"CDerive::PrintX : "<<x<<endl;
        CBase::PrintX();
    }

}
;

//子派生类
class CSubDerive : public CDerive
{
    
int x;
public:
    CSubDerive(
int n1,int n2,int n3):CDerive(n1,n2)
    
{    x=n3;    }
    
void PrintX()
    
{    cout<<"CSubDerive::PrintX : "<<x<<endl;
        CDerive::PrintX();
    }

}
;

void main()
{   cout<<"CBase size = "<<sizeof(CBase)<<endl;    
    cout
<<"CDerive size = "<<sizeof(CDerive)<<endl;
    cout
<<"CSubDerive size = "<<sizeof(CSubDerive)<<endl;
    cout
<<endl;

    CBase obj1(
1);    
CDerive obj2(
2,3);
CSubDerive obj3(
4,5,6);
    obj1.PrintX();
    obj2.PrintX();
    obj3.PrintX();
    cout
<<endl;

    CBase 
*pObj1=&obj1;    
    CDerive 
*pObj2=&obj2;    
    CSubDerive 
*pObj3=&obj3;
    pObj1
->PrintX();
    pObj2
->PrintX();
    pObj3
->PrintX();
    cout
<<endl;

    CBase 
*pObj[]={pObj1,pObj2,pObj3};
    pObj[
0]->PrintX();
    pObj[
1]->PrintX();
    pObj[
2]->PrintX();
    cout
<<endl;

    CBase 
&yobj1=obj1;
    CBase 
&yobj2=obj2;
    CBase 
&yobj3=obj3;
    yobj1.PrintX();
    yobj2.PrintX();
    yobj3.PrintX();
}
                                     1.  运行结果如下(4组打印语句的打印结果完全一样,在此只给出前两组打印语句的画面):                                               2.  对象的内容:                                                   3.  三个对象的地址及内容:                                                                                     4.  基类指针指向三个对象时,指针的详细内容:                                                      5.  基类对象引用三个对象:                                 
  • c++
  • http
  • 编译
  • 数组
  • 程序员
  • include
  • ios
  • int
  • main
推荐阅读
  • main

    C++省略号类型和参数个数不确定函数参数范例

    本文介绍了C++中省略号类型和参数个数不确定函数参数的使用方法,并提供了一个范例。通过宏定义的方式,可以方便地处理不定参数的情况。文章中给出了具体的代码实现,并对代码进行了解释和说明。这对于需要处理不定参数的情况的程序员来说,是一个很有用的参考资料。 ... [详细]
  • main

    P1651 塔 (动态规划) 的最大高度计算方法

    本文介绍了P1651题目的描述和要求,以及计算能搭建的塔的最大高度的方法。通过动态规划和状压技术,将问题转化为求解差值的问题,并定义了相应的状态。最终得出了计算最大高度的解法。 ... [详细]
  • main

    动态规划算法的基本步骤及最长递增子序列问题详解

    动态规划算法的基本步骤及最长递增子序列问题详解
    本文详细介绍了动态规划算法的基本步骤,包括划分阶段、选择状态、决策和状态转移方程,并以最长递增子序列问题为例进行了详细解析。动态规划算法的有效性依赖于问题本身所具有的最优子结构性质和子问题重叠性质。通过将子问题的解保存在一个表中,在以后尽可能多地利用这些子问题的解,从而提高算法的效率。 ... [详细]
  • main

    Codeforces 1294A题解:Collecting Coins整除+不整除问题解析

    本文为Codeforces 1294A题目的解析,主要讨论了Collecting Coins整除+不整除问题。文章详细介绍了题目的背景和要求,并给出了解题思路和代码实现。同时提供了在线测评地址和相关参考链接。 ... [详细]
  • main

    HDU 2372 El Dorado(DP)的最长上升子序列长度求解方法

    HDU 2372 El Dorado(DP)的最长上升子序列长度求解方法
    本文介绍了解决HDU 2372 El Dorado问题的一种动态规划方法,通过循环k的方式求解最长上升子序列的长度。具体实现过程包括初始化dp数组、读取数列、计算最长上升子序列长度等步骤。 ... [详细]
  • case

    九度OnlineJudge之1002:Grading问题的解决方法

    本文介绍了九度OnlineJudge中的1002题目“Grading”的解决方法。该题目要求设计一个公平的评分过程,将每个考题分配给3个独立的专家,如果他们的评分不一致,则需要请一位裁判做出最终决定。文章详细描述了评分规则,并给出了解决该问题的程序。 ... [详细]
  • java

    OC学习笔记之@property和@synthesize

    本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • case

    Open judge C16H: Magical Balls 快速幂+逆元问题解析

    本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • case

    差分约束系统求解House Man跳跃问题的思路与方法

    本文讨论了使用差分约束系统求解House Man跳跃问题的思路与方法。给定一组不同高度,要求从最低点跳跃到最高点,每次跳跃的距离不超过D,并且不能改变给定的顺序。通过建立差分约束系统,将问题转化为图的建立和查询距离的问题。文章详细介绍了建立约束条件的方法,并使用SPFA算法判环并输出结果。同时还讨论了建边方向和跳跃顺序的关系。 ... [详细]
  • java

    如何用UE4制作2D游戏文档——计算篇

    如何用UE4制作2D游戏文档——计算篇
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了如何用UE4制作2D游戏文档——计算篇相关的知识,希望对你有一定的参考价值。 ... [详细]
  • main

    油田地块的划分和计数方法

    本文介绍了一种划分和计数油田地块的方法。根据给定的条件,通过遍历和DFS算法,将符合条件的地块标记为不符合条件的地块,并进行计数。同时,还介绍了如何判断点是否在给定范围内的方法。 ... [详细]
  • main

    二叉树层序创建问题的解决方法

    本文介绍了解决二叉树层序创建问题的方法。通过使用队列结构体和二叉树结构体,实现了入队和出队操作,并提供了判断队列是否为空的函数。详细介绍了解决该问题的步骤和流程。 ... [详细]
  • main

    C函数ispunct()的用法及示例代码

    本文介绍了C函数ispunct()的用法及示例代码。ispunct()函数用于检查传递的字符是否是标点符号,如果是标点符号则返回非零值,否则返回零。示例代码演示了如何使用ispunct()函数来判断字符是否为标点符号。 ... [详细]
  • main

    输出1000内能被3整除且个位数为6的所有整数的程序填充

    本文介绍了一个程序,可以输出1000内能被3整除且个位数为6的所有整数。程序使用了循环和条件判断语句来筛选符合条件的整数,并将其输出。 ... [详细]
  • main

    UVALive6575 Odd and Even Zeroes 数位dp+找规律

    本文介绍了UVALive6575题目Odd and Even Zeroes的解法,使用了数位dp和找规律的方法。阶乘的定义和性质被介绍,并给出了一些例子。其中,部分阶乘的尾零个数为奇数,部分为偶数。 ... [详细]
author-avatar
会满足cy
这个家伙很懒,什么也没留下!
Tags | 热门标签
  • cmd
  • list
  • object
  • emoji
  • jar
  • 数组
  • input
  • join
  • buffer
  • header
  • fetch
  • email
  • include
  • python
  • hashcode
  • hash
  • dagger
  • request
  • uri
  • actionscrip
  • utf-8
  • main
  • php8
  • substring
  • lua
  • config
  • runtime
  • case
  • java
  • version
RankList | 热门文章
  • 1 1.线性回归
  • 2 excel窗口快捷键(excel代码窗口快捷键)
  • 3 EhCache Monitor的使用
  • 4 git常用命令和问题解决
  • 5 ReactRouter5——嵌套路由
  • 6 Spring事务超时探讨
  • 7 李宏毅机器学习——深度学习反向传播算法
  • 8 php5教程pdf,php5
  • 9 转载:elementui table :spanmethod(行合并)
  • 10 sqldeveloper连接oracle失败报12514(日常错误)
  • 11 Linux_进程控制(二)
  • 12 override and hiding
  • 13 Spring常用注解,javabean和java类有哪些区别
  • 14 tomcat热部署失败后,重新热部署依然404
  • 15 DAY1win2003关闭自动更新
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 | PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有
     

聚圣源北京tv悬疑推理小说相册名字怎么起农村合作社起什么名字好男孩子生辰八字起名大全上海第一财经直播花都最强医神给贾姓男孩起名字取名起名大全男诗经女楚辞2016火猴命起名字怎样免费起名隋姓男孩起名你家族的特产都是南北是什么意思英语起名网免费取名大全网络起名字店起名称中国对日本男篮直播360影视大全www.360kan.com开黑啦电视剧天敌央视4套在线直播给校起个名字在逆光中告白在线观看打分100分的宝宝起名以邦字结尾公司起名康熙字典十五画的起名吉利字192仙路何方国足15惨败泰国在线日本动漫淀粉肠小王子日销售额涨超10倍罗斯否认插足凯特王妃婚姻让美丽中国“从细节出发”清明节放假3天调休1天男孩疑遭霸凌 家长讨说法被踢出群国产伟哥去年销售近13亿网友建议重庆地铁不准乘客携带菜筐雅江山火三名扑火人员牺牲系谣言代拍被何赛飞拿着魔杖追着打月嫂回应掌掴婴儿是在赶虫子山西高速一大巴发生事故 已致13死高中生被打伤下体休学 邯郸通报李梦为奥运任务婉拒WNBA邀请19岁小伙救下5人后溺亡 多方发声王树国3次鞠躬告别西交大师生单亲妈妈陷入热恋 14岁儿子报警315晚会后胖东来又人满为患了倪萍分享减重40斤方法王楚钦登顶三项第一今日春分两大学生合买彩票中奖一人不认账张家界的山上“长”满了韩国人?周杰伦一审败诉网易房客欠租失踪 房东直发愁男子持台球杆殴打2名女店员被抓男子被猫抓伤后确诊“猫抓病”“重生之我在北大当嫡校长”槽头肉企业被曝光前生意红火男孩8年未见母亲被告知被遗忘恒大被罚41.75亿到底怎么缴网友洛杉矶偶遇贾玲杨倩无缘巴黎奥运张立群任西安交通大学校长黑马情侣提车了西双版纳热带植物园回应蜉蝣大爆发妈妈回应孩子在校撞护栏坠楼考生莫言也上北大硕士复试名单了韩国首次吊销离岗医生执照奥巴马现身唐宁街 黑色着装引猜测沈阳一轿车冲入人行道致3死2伤阿根廷将发行1万与2万面值的纸币外国人感慨凌晨的中国很安全男子被流浪猫绊倒 投喂者赔24万手机成瘾是影响睡眠质量重要因素春分“立蛋”成功率更高?胖东来员工每周单休无小长假“开封王婆”爆火:促成四五十对专家建议不必谈骨泥色变浙江一高校内汽车冲撞行人 多人受伤许家印被限制高消费

聚圣源 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化