This 指針

????? 如果你期望衍生類別重新定義一個成員函數,那么你應該在基礎類別中把此函數設為 virtual。
????? 以單一指令喚起不同函數,這種性質稱為Polymorphism,意思是"the ability toassume many forms",也就是多態。
????? 虛擬函數是C++ 語言的Polymorphism 性質以及動態綁定的關鍵。


class CShape   // 形狀  
02. {  
03.    private:  
04.      int m_color;  
05.    public:  
06.      void setcolor(int color) { m_color = color; }  
07. };  
08.  
09.  classCRect : public CShape    // 矩形是一種形狀,它會繼承 m_color 和setcolor()  
10. {      
11.    public:  
12.      voiddisplay() { ... }  
13. };  
14.  
15. class CEllipse : public CShape   // 橢圓形是一種形狀,它會繼承 m_color 和setcolor()  
16. {       
17.    public:  
18.      voiddisplay() { ... }  
19. };  
20.  
21. class CTriangle : public CShape  // 三角形是一種形狀,它會繼承 m_color 和setcolor()  
22. {     public:  
23.       void display() { ... }  
24. };  
25.  
26. classCSquare : public CRect    // 四方形是一種矩形  
27. {  
28.     public:  
29.       void display() { ... }  
30. };  
31.  
32. class CCircle : public CEllipse  // 圓形是一種橢圓形  
33. {  
34.     public:  
35.       void display() { ... }  
36. };  
37.    //于是可以這么動作:  
38.    CSquare square;  
39.    CRect rect1, rect2;  
40.    CCircle circle;  
41.    square.setcolor(1); // 令 square.m_color = 1;  
42.    m_color m_color  
43.    CRect::setcolor(int color,  
44.    square.display(); // 調用CSquare::display  
45.    rect1.setcolor(2); // 于是rect1.m_color = 2  
46.    rect1.display(); // 調用CRect::display  
47.    rect2.setcolor(3); // 于是rect2.m_color = 3  
48.    rect2.display(); // 調用CRect::display  
49.    circle.setcolor(4); // 于是circle.m_color = 4  
50.    circle.display(); // 調用CCircle::display  

?????? 兩個矩形對象rect1 和rect2 各有自己的m_color 成員變量,但rect1.setcolor 和rect2.setcolor 卻都通往唯一的CRect::setcolor 成員函數。? 那么CRect::setcolor 如何處理不同對象中的m_color?答案是:成員函數有一個隱藏參數,名為this 指針。當你調用:

rect1.setcolor(2); // rect1 是CRect 對象    
rect2.setcolor(3); // rect2 是CRect 對象   


??? 編譯器實際上為你做出來的碼是:

CRect::setcolor(2, (CRect*)&rect1);    
02.CRect::setcolor(3, (CRect*)&rect2);  
??? 不過,由于CRect 本身并沒有聲明setcolor,它是從CShape 繼承來的,所以編譯器實際上產生的碼是:
CShape::setcolor(2, (CRect*)&rect1);    
02.CShape::setcolor(3, (CRect*)&rect2);  
??? 多出來的參數,就是所謂的this 指針。至于類別之中,成員函數的定義:
class CShape    
02.  
03....    
04.public:    
05.void setcolor(int color) { m_color = color; }   
??? 被編譯器整治過后,其實是:
class CShape  
02.{ ...  
03.  public:  
04.  void setcolor(int color, (CShape*)this) { this->m_color = color; }  
05.};  




本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/254777.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/254777.shtml
英文地址,請注明出處:http://en.pswp.cn/news/254777.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

史上最全亞歷山大大帝名言

(1)把財富分給他人,把希望留給自己,他將帶給我無窮的財富。——亞歷山大大帝 (2)山不走到我這里來,我就走到他那里去。——亞歷山大大帝 (3)能夠戰勝恐懼就能戰勝死亡。—…

jdbcmysql

做java開發難免會用到數據庫,操作數據庫也是java開發的核心技術。那我們現在就來談談javajdbc來操作mysql數據庫吧 第一步:我們需要把mysql的驅動引進來這里引驅動就是把mysql-connector-java-5.1.37-bin.jar加到項目中來,下面附jar包 第二步&#xff1a…

char **p, char a[16][8]; 問:p=a 是否會導致程序在以后出現問題?為什么?

int (*v)[10]; 在 Visual C 里面不能與 int **v 等同起來。 舉個例子: int **p; int (*v)[10]; int a[10][10]; 如果寫 v a 是可以的。 如果寫 p a 將會引起一個類型不匹配的編譯錯誤。 二級指針(int **p)需要自己指向一個一級指針&#x…

draw_circle_mod預生成交互式圓形

目錄draw_circle_mod(算子)描述參數draw_circle_mod(算子) draw_circle_mod - 圓的交互式繪圖。 draw_circle_mod(:: WindowHandle,RowIn,ColumnIn,RadiusIn:Row&#…

川崎機器人c#通訊(轉)

由于本人在工業自動化行業做機器視覺的工作,所以除了圖像處理方面要掌握外,還需要與工業機器人進行通信。最近學習了計算機與川崎機器人的TCP/IP通信,于是在這里記錄一下。 除了直接與機器人通信外,有一種方式是通過PLC間接通信&a…

模板類 Template Classes 以及模板類編譯時的處理

我們可以建立template classes,使它們能夠神奇地操作任何類型的資料。下面這個例子是讓CThree 類別儲存三個成員變量,成員函數Min 傳回其中的最小值,成員函數Max 則傳回其中的最大值。我們把它設計為template class&…

行轉列及列轉行查詢

開發過程中常遇到行轉列或是列轉行的問題,即需要將數據庫中一張表信息進行行轉列操作,再將每列(即每個字段)作為與其他表進行聯表查詢的字段進行顯示。 一、行轉列:將原來同一列下多行的不同內容作為多個字段&#xff…

移動端系列講解之字體單位

移動端字體單位有哪些?他們的兼容性如何?他們的特點?1.移動端字體單位現在主要有 em 、rem 、px 2.兼容性請傳送點擊這里 em: em是相對長度單位。相對于父元素設置的字體大小。em相對于當前對象內文本的字體尺寸。如當前對行內文本的字體尺寸…

x264_param_t參數注解

typedef struct x264_param_t { CPU 標志位 unsigned int cpu; int i_threads; 并行編碼多幀 int b_deterministic; 是否允許非確定性時線程優化 int i_sync_lookahead; 線程超前緩沖 視頻屬性 int i_width; 寬度 int i_height; 高…

gen_circle_contour_xld創建圓或圓弧的XLD輪廓

目錄gen_circle_contour_xld(算子)描述參數gen_circle_contour_xld(算子) gen_circle_contour_xld - 創建圓或圓弧的XLD輪廓。 gen_circle_contour_xld(:ContCircle:Row,Column&am…

一、Java語言基礎(4)_方法和數組——數組

2018-04-25 不悔夢歸處,只恨未盡心 數組 一、一維數組 數組的含義:具有相同類型的多個變量按有序形式組織起來的數據形式。(數組是用來存儲固定大小的同類型元素。)數組的定義:方式1(推薦使用)&…

http header 具體解釋

HTTP(HyperTextTransferProtocol)即超文本傳輸協議,眼下網頁傳輸的的通用協議。HTTP協議採用了請求/響應模型,瀏覽器或其它client發出請求,server給與響應。就整個網絡資源傳輸而言,包含message-header和me…

研究生開題報告需要注意的幾點

1 畢業論文選題的原則 畢業論文選題一般要求滿足以下原則: ①開拓性:前人沒有專門研究過或雖已研究但尚無理想的結果,有待進一步的探討和研究,或是學術界有分歧,有必要深入研究探討的問題;…

create_metrology_model創建測量幾何形狀所需的數據結構(原理)

目錄create_metrology_model(算子)描述二維計量的基本原理創建計量模型數據結構提供近似值修改模型參數修改對象參數對齊計量模型應用測量訪問結果清理記憶注意參數create_metrology_model(算子) create_metrology_model - 創建測…

X264碼率控制流程分析

碼率控制的理論知識:碼率控制的目的和意義:圖像通信中碼率控制的目的:通過調節編碼參數,控制單位時間內的編碼視頻流的數據量,以使產生的比特流符合各種應用的需求。視頻壓縮的效率和視頻內容有很大的關系,…

STL-list

#include "stdafx.h"#include<iostream>#include<string>#include<vector>//vector向量容器#include<deque>#include<list>#include<algorithm>using namespace std;/* list介紹 list容器實現了雙向鏈表的數據結構&#xff0c;數…

Java微信二次開發(九)

多媒體文件上傳與下載 第一步&#xff1a;找到包com.wtz.vo&#xff0c;新建類WeixinMedia.java 1 package com.wtz.vo;2 3 /**4 * author wangtianze QQ:8646200125 * date 2017年4月25日 上午11:10:316 * <p>version:1.0</p>7 * <p>descri…

add_metrology_object_generic將測量對象添加到計量模型中

目錄add_metrology_object_generic&#xff08;算子&#xff09;描述可能的形狀測量區域的定義通用參數參數add_metrology_object_generic&#xff08;算子&#xff09; add_metrology_object_generic - 將計量對象添加到計量模型中。 add_metrology_object_generic&#xff…

關于發那科機器人的FSSB

&#xfeff;&#xfeff;FSSB是指fanuc Serial Servo Bus&#xff0c;即發那科串行伺服總線&#xff08;光纜&#xff09;&#xff0c;連接CNC與伺服放大器。HSSB是指High-Speed Serial Bus&#xff0c;即高速串行總線&#xff08;光纜&#xff09;&#xff0c;連接CNC與外部P…

H264規定了三種主要檔次

H264規定了三種主要檔次&#xff0c;每個檔次支持一組特定的編碼功能&#xff0c;并支持一類特定的應用。 1、基本檔次&#xff08;Baseline Profile&#xff09;&#xff1a;利用I片和P片支持幀內和幀間編碼&#xff0c;支持利用基于上下文的自適應的變長編碼進行的熵編碼&…