C++ 多态与虚拟:Class 语法语义
1.object与class:在object-oriented programming编程领域,对象(object)有更严格的定义。对象是由数据结构和用于处理该结构的过程(称为methods)组成的实体(instance)。这些方法由对象接收的消息激活。一个对象的内部数据结构与其他对象完全隔离(此属性称为“encapsulation”)。对象是基于模板生成的。从某个模板生成的实体(instance)的集合称为类。有一个重要的属性叫做继承,它允许在现有类上构建新的类,继承现有类的全部或部分特性,并允许扩展新特性。有些系统甚至实现了多重继承,允许一个类从多个父类继承。如果你还是没有懂,那么只要建立这样一个概念就行了,Object就是个“东西”,是“东西”就得占空间,在计算机中就得占一定内存,所以我们称他为实体(instance)。上述相档部份在描述“东西”的产生,它说“东西是模板产生的”,其实这模板(template)就是“东西”的属性描述,也就是类(class)。需要注意的是class是一种属性的描述,而并非实体,根据class产生的object才是实体。
2.instantiation:产生object的过程我们称之为实例化(instantiation),根据object class(或者template)产生一个实体的过程就是instantiation。
3.object-oriented programming:面向对象编程是一种编程方式,它使用“对象”作为程序的基本功能单元。程序员会花费很多精力来描述对象的属性,包括它们的数据和行为(处理数据的方法),并使用“类”的语法来展示他们的设计。当程序开始运行时,根据设计好的类,会创建出实际的对象。这些对象会相互合作,共同实现程序的功能。此外,像int、float、long这样的语言内置类型也可以看作是一种类,它们用于描述数据的性质,但通常没有相关的处理程序。
int i; // i 是 一 个 int object.
float f; // f 是一个 float object.
4.object与class的关系:现在让我们以一个实例说明一下object与class的关系,假设我们的class设计如下:
1 //CStroke描述线条应有的特征
2
3 class CStroke
4 {
5 //CStroke的行为
6 public:
7 void DrawStroke( /*....*/ ){ }; //画线条
8 void Serialize( /*....*/ ){ }; //档案调用
9
10 //CStroke的数据
11 protected:
12 vector<Point*>m_Array; //存储线条坐标
13 int m_penColor;//笔的颜色
14 int m_penWidth;//笔的宽度
15 int m_penStyle;//笔的样式
16 };
于是每当使用者在屏幕上画一线条(stoke),计算机便有程序中产生一个CStroke object,其中有一个array准备用来存储线条上各点的坐标,以及三个int变量分别代表笔的颜色、宽度、样式。我们必肌设计一些UIQ函数,让使用者能够以滑动鼠标来代替画笔,直接在屏幕上输出构成线条的每一个点坐标,以下图为例,程序产生了8个CStroke object。

5. class的声明和实现( Declaration & Implementation):下面是 C++ class 的声明形式(declaration),通常放在 .h 文件中:
1 class CPoint{
2 public:
3 CPoint(float x=0.0) :_x(x){}
4
5 float x(){return _x;}
6
7 void x(float xval ){_x=xval;}
8
9 protected:
10 float _x; // data member
11
12
13 };
class内含有两种东西:一个是data member(例如上面的_x),一个是menber functions(例如上述的CPoint()以及两个x())。上例的三个member functions都直接在class中完成了实现,所以自动成为一个inline函数。通常是函数比较简单的我们才会这样做,如果函数比较复杂的,我们会在class declaration 中完成member functions的声明,而在.cpp文件中完成实现的部分(implementation)例如:
1 //in hello.h
2
3 class CPoint{
4 public:
5 CPoint(float x=0.0) :_x(x){}
6
7 float x(); //只是member function的声明
8
9 void x(float xval );//只是member function的声明
10
11 protected:
12 float _x; // data member
13
14
15 };
1 //in hello.cpp
2 #include "hello.h"
3
4 float CPoint::x(){return _x;} //实现内容
5 void CPoint::x(float xval ){_x=xval;} //实现内容
6.符号命名习惯( Naming Convention):有一种常见的符号命名习惯是在class名称前面加上“C”,在data members名称前面加上"m_",至于member functions,并没有什么常见的命名习惯。
C++ 多态与虚拟:Class 语法语义的更多相关文章
- 多态与虚拟 : 物件导向的精髓 (侯捷在石器时代对OO的理解)
[自序]虑而後能得(自序)故事接触 C++ 大约是 1989 年的事.那时候的 PC 以现在的眼光看,除了「蛮荒」之外没有更合适的形容词了.横扫千军的 Windows 3.0 还没有诞生,如今以 C+ ...
- 多态,虚拟方法,重写,接口,类库,委托,is,as运算符,泛型集合,万能变量
多态:简而言之就是龙生九子,各有不同 有了继承,才有了多态 1.虚方法 virtual重写 override父类中的方法,在子类中并不适用,那么子类需要自主更改继承的方法或者是属性,那父类中加了vir ...
- Expression2Sql的一些语法更新
前言 前一阵子给大家介绍了一个可以将Expression表达式树解析成Transact-SQL的项目Expression2Sql. 之后得到了广大读者的一些好评,也使得博主更有动力继续更新下去,然后一 ...
- C#面向对象:多态
此文章转载网站:https://www.cnblogs.com/qixinbo/p/8244583.html 多态: 有多态之前必须要有继承,只有多个类同时继承了同一个类,才有多态这样的说法. 在继承 ...
- C#面向对象(三):多态
前文链接: C#面向对象(一):明确几个简单的概念作为开胃菜 C#面向对象(二):封装和继承 今天来聊聊面向对象的多态,这部分算是比较重要和核心的,很多工作2年多的程序员其实对于面向对象和多态的理解也 ...
- JavaScript6 新语法 let 有什么优势
最近看国外的前端代码时,发现ES6的新特性已经相当普及,尤其是 let,应用非常普遍 虽然 let 的用法与 var 相同,但不管是语法语义上,还是性能上,都提升了很多,下面就从这两方面对比一下 语法 ...
- Java 中多态的实现(下)
Java 中多态的另一个语法实现是重写.重载是通过静态分派实现的,重写则是通过动态分派实现的. 在学习动态分派之前,需要对虚拟机的知识有一个初步的了解. 虚拟机运行时数据区 运行 Java 程序时,虚 ...
- Java将增加虚拟线程,挑战Go协程
我们知道 Go 语言最大亮点之一就是原生支持并发,这得益于 Go 语言的协程机制.一个 go 语句就可以发起一个协程 (goroutin).协程本质上是一种用户态线程,它不需要操作系统来进行调度,而是 ...
- Java19虚拟线程都来了,我正在写的线程代码会被淘汰掉吗?
Java19中引入了虚拟线程,虽然默认是关闭的,但是可以以Preview模式启用,这绝对是一个重大的更新,今天Java架构杂谈带大家开箱验货,看看这家伙实现了什么了不起的功能. 1 为什么需要虚拟线程 ...
- C/C++ 笔试题
/////转自http://blog.csdn.net/suxinpingtao51/article/details/8015147#userconsent# 微软亚洲技术中心的面试题!!! 1.进程 ...
随机推荐
- InfluxDB、Grafana、node_exporter、Prometheus搭建压测平台
InfluxDB.Grafana.node_exporter.Prometheus搭建压测平台 我们的压测平台的架构图如下: 配置docker环境 1)yum 包更新到最新 sudo yum upda ...
- Garnet发布 Redis不再是唯一选择
Garnet 是 Microsoft Research 的远程缓存存储,提供强大的性能(吞吐量和延迟).可扩展性.存储.恢复.集群分片.密钥迁移和复制功能. Garnet 可以与现有的 Redis 客 ...
- 记录-记一次不规范使用key引发的惨案
这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 前言 平时在使用v-for的时候,一般会要求传入key,有没有像我一样的小伙伴,为了省心,直接传索引index,貌似也没有遇到过什么问题, ...
- Scala 特质自身类型
1 package chapter06 2 3 object Test16_TraitSelfType { 4 def main(args: Array[String]): Unit = { 5 va ...
- 取消掉远程桌面mstsc顶部(侧面)连接栏
在进行mstsc远程桌面连接电脑或者虚拟机的时候,总是会出现一个连接栏.虽然点左边的图钉可以自动隐藏,但是每次鼠标滑到上面的时候,还是会冒出来,这个就有点闹心了. 查了下相关资料,解决了,特写下相关教 ...
- 关于 kafka 消息的顺序问题一二
顺序就像就是 12345,任何 12354.12543.51234等都不行. 因为是 mq,所以必然涉及三个主体:发送方.消息服务器.消费方. 一.kafka 消息服务器 kafka brokers ...
- HandlerInterceptorAdapter和HandlerInterceptor的区别
其实归根揭底一个是抽象类,一个是接口,HandlerInterceptor是接口,它提供了所有方法,让开发人员必须实现所有方法, 而HandlerInterceptorAdapter是一个抽象类,它提 ...
- #树形依赖背包,点分治#BZOJ 4182 Shopping
题目 给定一棵大小为 \(n\) 的树,每个点代表一种物品,其具有体积.价值和数量的属性, 现在选择一个连通块,使得里面所有点都被选中且体积不超过 \(m\),问最大价值. \(n\leq 500,m ...
- #KD-Tree,替罪羊树#洛谷 6224 [BJWC2014]数据
题目 平面上有 \(N\) 个点.需要实现以下三种操作: 在点集里添加一个点: 给出一个点,查询它到点集里所有点的曼哈顿距离的最小值: 给出一个点,查询它到点集里所有点的曼哈顿距离的最大值. 分析 用 ...
- IT的贵与慢
本文于2019年7月24日完成,发布在个人博客网站上. 考虑个人博客因某种原因无法修复,于是在博客园安家,之前发布的文章逐步搬迁过来. 笔记而已,没有逻辑. 贵与慢,一方面是事实,另一方面是偏见. 流 ...