c++中基类与派生类中隐含的this指针的分析

先不要看结果,看一下你是否真正了解了this指针?

 1 #include<iostream>
 2 using namespace std;
 3 
 4 class Parent{
 5      public:
 6          int x;
 7          Parent *p;
 8      public:
 9          Parent(){}
10          Parent(int x){
11            this->x=x; 
12            p=this;
13         }
14          virtual void f(){
15             cout<<"Parent::f()"<<endl; 
16         }
17         void g(){
18             cout<<"Parent::g()"<<endl;
19         }
20     
21         void h(){
22             cout<<"Parent::h()"<<endl;
23             f();
24             g();
25             y();
26             cout<<"LOOK HERE: "<<x<<endl;
27         }
28         
29         private:
30             void y(){
31                 cout<<"Parent::y()"<<endl;
32             }
33 };
34 
35 class Child : public Parent{
36     public:
37         int x;
38         
39     public:
40         Child(){}
41         Child(int x) : Parent(x+5){//正确的调用父类构造函数要写在初始化型参列表中 
42             
43              //这样企图调用父类的构造函数是错误的,因为这是另外创造了一个临时对象,函数结束之后就什么都没有了! 
44             //Parent(x+5);
45             this->x=x;
46         }
47         void f(){
48             cout<<"Child f()"<<endl;
49         }
50         void g(){
51             cout<<"Child g()"<<endl; 
52         }
53 };
54 
55 int main(){
56     //例一 
57     Child *ch=new Child();
58     ch->h(); 
59     cout<<endl;
60     //例二: 
61     ch=new Child(5);
62     ch->h();
63     cout<<endl;
64     
65     //例三: 
66     ch->p->h();
67     return 0;
68 } 
/*
Parent::h()
Child f()
Parent::g()
Parent::y()
LOOK HERE: 9306304Parent::h()
Child f()
Parent::g()
Parent::y()
LOOK HERE: 10Parent::h()
Child f()
Parent::g()
Parent::y()
LOOK HERE: 10
*/ 

 

首先Child继承了Parent中的 h()方法!
我们new 了一个Child类的对象XXX, 用ch指向了它!
当ch去调用h()方法的时候,好了关键的问题来了,那就是此时的this指针到底是指向谁的....

要知道,this指针是和对象相关的,所以无论怎样,那么调用h()方法的是XXX这个对象,
那么this就是指向XXX这个对象XXX!在入栈的时候,this也一同被压入!既然this是指向XXX
的,为什么会调用基类的g()方法呢?然后又调用的是派生类中的f()方法呢?(注意:g()方法
和f()方法在基类和派生类中都有).....

仔细看一下,是不是感觉和派生类向上转型为基类的多态差不多啊。子类在调用h()方法时,其实
默认将this的类型进行了向上提升,也就是由Child* this -> Parent* this;想一想这是必须的,
why?因为h()只是派生类继承基类的,并没有进行重写!如果没有进行this的类型提升,那么
如果h()方法中存在对基类私有成员的访问,比如这个子类中的y()方法是私有的!h()中调用了
y(); 也就是this->y();是不是矛盾了?派生类中怎么可以访问基类中的私有成员呢???

所以this的类型一定向上提升了!
如果还是不信,那你看一下 样例2 中的x值是不是输出的是基类中的 x 的值!
再看一看 样例3中的输出是不是和样例2的输出时一样的!从f()的调用和g()调用
可以看出是多态的结果...

转载于:https://www.cnblogs.com/hujunzheng/p/3963320.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/531679.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java中子类与父类中隐含的this引用的分析

/*看一下下面的程序&#xff0c;看是否你的答案和运行的答案是否一致&#xff01; */ class Parent{public int x;public Parent p;public Parent(){}public Parent(int x){this.xx; pthis;}public void f(){System.out.println("Parent::f()"); }public void g(){Sy…

php注册机制,php自动注册登录验证机制实现代码_PHP教程

背景&#xff1a;在phpwind站点后台添加一个名为“广告管家”(广告管家为CNZZ的一款广告投放的应用)的应用&#xff0c;整个“广告管家”的应用是通过iframe载入&#xff0c;载入的具体内容根据不同站点显示针对该站点的具体内容&#xff0c;为了提高易用性&#xff0c;有以下的…

codeforce No to Palindromes!(枚举)

1 /*2 题意&#xff1a;给定一个字符串中没有任何长度>1的回文子串&#xff01;求按照字典序的该串的下一个字符串3 也不包含长度>1的任何回文子串&#xff01;4 5 思路&#xff1a;从最低位进行枚举&#xff0c;保证第i位 不与 第 i-1位和第 i-2位相…

php js 比较,PHP与JS的比较

1楼一直以来&#xff0c;php和js一样&#xff0c;都被视做脚本语言。的确&#xff0c;他们两者蛮像的。首先他们都是弱类型语言&#xff0c;定义变量的时候不需要指定某个具体类型&#xff0c;变量类型可以实现隐式转换。虽然很多人说这样会带来很多一些潜在的问题&#xff0c;…

codeforces Restore Cube(暴力枚举)

1 /*2 题意&#xff1a;给出立方体的每个顶点的坐标&#xff08;是由源坐标三个数某几个数被交换之后得到的&#xff01;&#xff09;&#xff0c; 3 问是否可以还原出一个立方体的坐标&#xff0c;注意这一句话&#xff1a;4 The numbers in the i-th output line…

php 非递归调用,php 无限分类(非递归)

/*** 无限分类* 2011/8/24* kcj* */include "../conn/conn.php";$flpid$_POST[flpid];$fltitle$_POST[title];$fldes$_POST[des];if(isset($_POST[action])!&&$_POST[action]"add"){ // 无限分类(非递归)&#xff0c;用路径来判断分类归属(flidflp…

树状数组三种模型

树状数组在区间求和问题上有大用&#xff0c;其三种复杂度都比线段树要低很多……有关区间求和的问题主要有以下三个模型&#xff08;以下设A[1..N]为一个长为N的序列&#xff0c;初始值为全0&#xff09;&#xff1a;&#xff08;1&#xff09;“改点求段”型&#xff0c;即对…

php实现直播答题系统,直播答题解决方案

概述即构提供直播答题一站式解决方案&#xff0c;包括 Windows 主播端、移动 APP 端示例源代码(iOS、Android)。1 下载/体验地址由于直播答题场景需要主播端(推流、发题)和观众端(拉流、答题)配合使用&#xff0c;因此开发者需要同时下载这两端的软件。下载后&#xff0c;具体的…

poj 3486 A Simple Problem with Integers(树状数组第三种模板改段求段)

1 /*2 树状数组第三种模板&#xff08;改段求段&#xff09;不解释&#xff01; 不明白的点这里&#xff1a;here&#xff01;3 */4 #include<iostream>5 #include<cstring>6 #include<cstdio>7 #include<algorithm>8 #define N 1000059 us…

php路由类默认模块,微擎入口路由及其模块入口路由 - YangJunwei

一、微擎入口路由微擎有2个入口文件/web/index.php?csite&aentry/app/index.php?centry路由变量$controller $_GPC[c]; //web入口缺省值account&#xff0c;app入口home$action $_GPC[a]; //index.php入口文件开头$acl变量可配置默认方法$do $_GPC[do];不管$action是什…

matlab subs 慢,求助matlab程序计算速度过慢的原因

程序代码如下function [length]contactlength(x0)if x0>50||x0error:数据超出尺寸范围elsesyms xR300;%非球面顶点曲率半径c1/R;delta0.1;k-3.3;%非球面参数rb27;%半径y(-1*c*x.^2)./(1sqrt(1-(1k)*(c^2)*x.^2));dydiff(y);dy2diff(y,2);dyx0subs(dy,x0);dy2x0subs(dy2,x0);…

matlab r2010a教程,MATLAB教程R2010a(十二五)

第1章 基础准备及入门1.1 MATLAB的安装和工具包选择1.2 Desktop操作桌面的启动1.2.1 MATLAB的启动1.2.2 Desktop操作桌面简介1.3 Command Window运行入门1.3.1 Commancl Winelow指令窗简介1.3.2 最简单的计算器使用法1.3.3 数值、变量和表达式1.4 Command Window操作要旨1.4.1 …

java中解决组件重叠的问题(例如鼠标移动组件时)

java中解决组件覆盖的问题&#xff01; 有时候在移动组件的时候会出现两个组件覆盖的情况&#xff0c;但是你想让被覆盖的组件显示出来或者不被覆盖&#xff01;在设计GUI时已经可以定义组件的叠放次序了&#xff08;按摆放组件的先后顺序&#xff09;。 真正麻烦的是响应哪…

matlab桥梁受力计算公式,matlab桥梁计算

等级&#xff1a;文件 218KB格式 pdf内容简介 该文结合斜拉桥施工监控的工程实践&#xff0c;分析研究利用MATLAB 6&#xff0e;0神经网络算法&#xff0c;可实现模式识别和函数逼近&#xff0c;进行信号处理&#xff0c;利用人工智能进行自动控制及非线性预测等。斜拉桥智能施…

php自然排序法的比较过程,PHP中strnatcmp()函数“自然排序算法”进行字符串比较用法分析(对比strcmp函数)...

本文实例讲述了PHP中strnatcmp()函数“自然排序算法”进行字符串比较用法。分享给大家供大家参考&#xff0c;具体如下&#xff1a;PHP中strnatcmp()函数使用"自然"算法来比较两个字符串(区分大小写)&#xff0c;通常在自然算法中&#xff0c;数字 2 小于数字 10。而…

2014 网选 5014 Number Sequence(异或)

1 /*2 题意&#xff1a;a, b两个序列&#xff0c;规定由[0, n]区间的数&#xff01;3 求 a[i] ^ b[i] 的和最大&#xff01; 4 5 思路&#xff1a;如果数字 n的二进制有x位&#xff0c; 那么一定存在一个数字m&#xff0c;使得n^m的所有二进制位6 都是1&am…

2014 网选 5007 Post Robot(暴力或者AC_自动机(有点小题大作了))

//暴力&#xff0c;从每一行的开始处开始寻找要查询的字符 #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std;char str[100005];int main(){while(gets(str)){for(int i0; str[i]; i)if(str[i]A){if(s…

java 如何放大动画图,Android仿微信图片放大动画

&#xff03;今年三月份直接上手做的android&#xff0c;代码写的不规范&#xff0c;有问题希望指出&#xff0c;谢谢(app数英)类似于微信 图片浏览的效果&#xff0c;我的做法是在两个activity A\B之间传递图片的位置信息思路&#xff1a;在activity A的list view上有一张图片…

2014 网选 5012 Dice(bfs模板)

1 /*2 题意&#xff1a;就是给定两个筛子&#xff0c;每个筛子上6个面&#xff0c;每个面的数字属于[1,6]&#xff0c; 且互不相同&#xff01;3 问a筛子最少经过按照题目规定的要求转动&#xff0c;达到和b筛子上下左右前后的数字相同&#xff01;4 5 思路&am…

matlab 神经网络dpi,基于DPI和BP神经网络的P2P流量识别研究

研究与开发 现代计算机 2019.04 上 文章编号&#xff1a;1007-1423(2019)10-0031-05 DOI&#xff1a;10.3969/j.issn.1007-1423.2019.10.007 基于 DPI 和 BP 神经网络的 P2P 流量识别研究 万建伟&#xff0c;胡勇 (四川大学电子信息学院&#xff0c;成都 610021) 摘要&#xff…