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.pswp.cn/news/531679.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/531679.shtml
英文地址,請注明出處:http://en.pswp.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…