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.mzph.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;支持利用基于上下文的自适应的变长编码进行的熵编码&…