当前位置: 首页 > news >正文

定制建设网站网站右侧浮动代码

定制建设网站,网站右侧浮动代码,私域运营软件,女人和男人做爰网站我是荔园微风#xff0c;作为一名在IT界整整25年的老兵#xff0c;今天来说说Visual C中的虚函数和纯虚函数。该系列帖子全部使用我本人自创的对比学习法。也就是当C学不下去的时候#xff0c;就用JAVA实现同样的代码#xff0c;然后再用对比的方法把C学会。 直接说虚函数… 我是荔园微风作为一名在IT界整整25年的老兵今天来说说Visual C中的虚函数和纯虚函数。该系列帖子全部使用我本人自创的对比学习法。也就是当C学不下去的时候就用JAVA实现同样的代码然后再用对比的方法把C学会。 直接说虚函数和纯虚函数有很多人会直接晕但是来看这篇帖子的很多人是有JAVA或其他面象对象编程基础的我要不就先作个类比究竟什么是虚函数和纯虚函数其实很简单初学者可以直接把C中的虚函数和纯虚函数理解成JAVA中的抽象函数。这样是不是瞬间就明白了 我也是在实践中发现如果你先理解了JAVA的抽象类和抽象函数你再理解C的虚函数和纯虚函数就会很简单。哈哈这个方法好吧。 那么理解了我上面说的我们只需要再区别一下C中的虚函数和纯虚函数理解成JAVA中的抽象函数找寻一些他们之间的不同点就可以了。 好了下面代码部分是本文的精华请仔细比对下面两段代码一段是C一段是JAVA他们在实现同一个事情输出结果也一样但表达不同。 Facade外观模式是一种通过为多个复杂子系统提供一个一致的接口从而使这些子系统更加容易被访问的模式。 以医院为例就医时患者需要与医院不同的职能部门交互完成挂号、门诊、取药等操作。为简化就医流程设置了一个用户界面友好的接待机器的角色患者只要在这台机器上操作机器就能代患者完成上述就医步骤患者则只需与接待机器交互即可。 我们先用JAVA代码来实现 import java.util.*;interface Patient{String getName(); }interface Disposer{void dispose(Patient patient); }class Registry implements Disposer{//挂号public void dispose(Patient patient){System.out.println(registering... patient.getName());} }class Doctor implements Disposer{//门诊public void dispose(Patient patient){System.out.println(diagnosing... patient.getName());} }class Pharmacy implements Disposer { //取药public void dispose(Patient patient){System.out.println(giving medicine... patient.getName());} }class Facade{private Patient patient;public Facade(Patient patient){this.patientpatient;}public void dispose(){Registry registrynew Registry();Doctor doctornew Doctor();Pharmacy phnew Pharmacy();registry.dispose(patient);doctor.dispose(patient);ph.dispose(patient);} }class ConcretePatient implements Patient{private String name;public ConcretePatient(String name){this.namename;}public String getName(){ return name;} }class FacadeTest{public static void main(String[] args){Patient patientnew ConcretePatient(name);Facade fnew Facade(patient);f.dispose(); }然后我们再用比较难的C语言写一遍上面这个意思。 #include iostream #include string using namespace std:class Patient{ public:virtual string getName()0; }class Disposer { public:virtual void dispose(Patient *patient)0; }class Registry:public Disposer{ //挂号 public:void dispose(Patient *patient){coutregistering... patient-getName() endl;} };class Doctor:public Disposer{ //门诊 public:void dispose(Patient *patient){cout diagnosing... patient-getName() endl;} };class Pharmacy: public Disposer{ //取药 public:void dispose(Patient *patient){cout giving medicine. patient-getName() endl;} };class Facade{ private:Patient *patient; public:Facade(Patient *patient){ this-patientpatient;}void dispose(){Registry *registrynew Registry();Doctor *doctornew Doctor();Pharmacy *phnew Pharmacy();registry-dispose(patient);doctor-dispose(patient);ph-dispose(patient);} };class ConcretePatient:public Patient{ private:string name; public:ConcretePatient(string name){this-namename;}string getName(){return name;} };int main(){Patient *patientnew ConcretePatient(name);Facada *fnew Facade(patient);f-dispose();return 0; }  Java抽象类和C虚基类的不同点 java和C都是面向对象编程语言遵循面向对象的特性继承封装多态。由于java的抽象类和C虚基类很像本文对二者在这两个概念上进行一些比较。从名称上来讲标准的概念 C虚函数虚基类 java抽象方法抽象类接口。 C中虚函数的存在是为了实现多态。C中用virtual关键字来标识虚函数即普通成员函数加上virtual就成为虚函数。Java中没有虚函数的概念它的普通函数就相当于C的虚函数动态绑定是Java的默认行为。java中如果某个方法不想被子类实现就用final关键字使其变成非虚函数。java抽象函数/C纯虚函数其实就是没有方法体的方法即一个方法只有声明没有定义实现。抽象函数或者说是纯虚函数的存在是为了定义接口。 C中纯虚函数形式为virtual void print() 0; Java中纯虚函数形式为abstract void print(); Java抽象类的存在是因为父类中既包括子类共性函数的具体定义也包括需要子类各自实现的函数接口。抽象类中可以有数据成员和非抽象方法。抽象类中可以没有抽象方法但具有抽象方法的类必须定义为抽象类抽象类不能实例化。C中抽象类只需要包括纯虚函数就是一个抽象类。如果仅仅包括虚函数不能定义为抽象类因为类中其实没有抽象的概念。Java抽象类是用abstract修饰声明的类而C中需要用virtual void print() 0;的形式来标识。 Java接口用interface来定义。接口中的变量自动具有public static final属性接口中的方法自动具有public abstract属性接口允许多继承。接口中不能有普通成员变量也不能具有非纯虚函数。 C中没有接口这个概念如果所有的方法都是纯虚函数即全虚基类可以将其视为和java中的接口是同等概念。这些纯虚函数必须要由子类重写就像java中的接口中的方法必须被实现一样。 虚基类同样不能实例化。纯虚函数不能有自己的函数体但是纯虚析构函数除外。 JAVA中的抽象函数与C中的虚函数比较 java中没有虚函数的概念但是有抽象函数的概念用abstract关键字表示java中抽象函数必须在抽象类中而且抽象函数不能有函数体抽象类不能被实例化只能由其子类实现抽象函数如果某个抽象类的子类仍是抽象类那么该子类不需要实现其父类的抽象函数。 C中的有虚函数的概念用virtual 关键字来表示每个类都会有一个虚函数表该虚函数表首先会从父类中继承得到父类的虚函数表 如果子类中重写了父类的虚函数不管重写后的函数是否为虚函数要调用哪个虚函数是根据当前实际的对象来判断的不管指针所属类型是否为当前类有可能是父类型指针当前指向的是哪种类型的对象就调用哪个类型中类定义的虚函数。每个类只有一张虚拟函数表所有的对象共用这张表。C的函数多态就是通过虚函数来实现的。 C中如果函数不是虚函数则调用某个函数是根据当前指针类型来判断的并不是根据指针所指向对象的类型。Java中如果函数不是抽象函数而是一个普通函数它是默认实现类似C中虚函数功能的也就是说调用某个函数是根据当前指针所指向对象的类型来判断的而不是根据指针类型判断。正好与C中的普通函数相反。即JAVA里自动实现了虚函数。 纯虚函数 主要特征是不能被用来声明对象,是抽象类,是用来确保程序结构与应用域的结构据具有直接映射关系的设计工具。带有纯虚函数的类称为抽象类抽象类能被子类 继承使用在子类中必须给出纯虚函数的实现如果子类未给出该纯虚函数的实现那么该子类也是抽象类只有在子类不存在纯虚函数时子类才可以用来声明对 象抽象类也能用于声明指针或引用或用于函数声明中。具有抽象类特性的类还有构造函数和析构函数全部是保护的类。如果没有给出纯虚函数的实现则在它所在的类的构造函数或析构函数中不能直接或间接的调用它。纯虚函数的实现可以在类声明外进行定义。 C中一般都是把析构函数声明为虚函数。因为虚函数可以实现动态绑定也就是到底调用哪个函数是根据指针当前指向哪个对象来确定的不是根据指针的类型来确定。如果C中不把析构函数声明为虚函数那么其有个子类重写了虚函数那么当父类指针指向一个子类对象时当调用析构函数时只调用父类的析构函数而无法调用子类的析构函数所以一般情况是把析构函数声明为虚函数实现动态绑定。当然如果一个类不包含虚函数这经常预示不打算将它作为基类使用。当一个类不打算作为基类时将析构函数声明为虚拟通常是个坏主意。比如标准 string 类型不包含虚函数如果把String作为基类继承得到子类会出问题。 总之多态基类应该声明虚析构函数。如果一个类有任何虚函数它就应该有一个虚析构函数如果不是设计用于做基类或不是设计用于多态这样的类就不应该声明虚析构函数。 关于接口与抽象类C中没有接口的概念与之对应的是纯虚类即只含有纯虚函数的类C抽象类的概念是含有纯虚函数成员的类。这是因为c提供多继承而像java、c#这些只提供单继承避免多继承的复杂性和低效性的语言为了模拟多继承功能就提供了接口概念接口可以继承多个。abstract class是抽象类至少包含一个纯虚函数的类就叫做抽象类。但是如果一个类所有的成员都是纯虚函数那么它和一般的抽象类在用法上是有区别的。至少microsoft给的com接口定义全部都是仅由纯虚函数构成的类。因此把这样的类定义叫做纯虚类也不算错。 纯虚函数和虚函数的区别在于前者不包含定义而后者包含函数体。 那么纯虚类就是不包含任何实现包括成员函数定义和成员变量定义。前者代表算法后者代表结构。不包含任何算法和结构的类叫做纯虚类应该没有问题。 在java里面的确没有纯虚类的概念因为java里没有纯虚函数这个概念。java管虚函数叫做abstract function管抽象类叫做abstract class直接说来java根本没有virtual这个关键字都用abstract代替因此java里面根本就没有pure这个概念。有那就是interface。在interface里面定义的函数都不能有函数体这个在java里面叫做接口。那么c里面与interface等同的概念就是纯虚类了c用纯虚类来模拟interface这个抽象概念因此这里说的“纯虚类”与java的abstract class不同与c的一般抽象类也不同。“纯虚类”与c一般抽象类的区别就好比java里面interface 和 abstract class的区别。 抽象类只能作为基类来使用其纯虚函数的实现由派生类给出。如果派生类中没有重新定义纯虚函数而只是继承基类的纯虚函数则这个派生类仍然还是一个抽象类。如果派生类中给出了基类纯虚函数的实现则该派生类就不再是抽象类了它是一个可以建立对象的具体的类。抽象类是不能定义对象的。 总结 C中的虚函数就是JAVA中的普通函数 C 中的纯虚函数就是JAVA中的抽象函数 C 中的抽象类就是JAVA中的抽象类 C 中的虚基类就是JAVA中的接口。 作者简介荔园微风1981年生高级工程师浙大工学硕士软件工程项目主管做过程序员、软件设计师、系统架构师早期的Windows程序员Visual Studio忠实用户C/C使用者是一位在计算机界学习、拼搏、奋斗了25年的老将经历了UNIX时代、桌面WIN32时代、Web应用时代、云计算时代、手机安卓时代、大数据时代、ICT时代、AI深度学习时代、智能机器时代我不知道未来还会有什么时代只记得这一路走来充满着艰辛与收获愿同大家一起走下去充满希望的走下去。
http://www.lakalapos1.cn/news/17398/

相关文章:

  • js建设网站网站开发会遇到哪些问题
  • 北京网站建设在线重庆网站制作一般需要多少钱
  • 肯尼亚网站域名网站开发与维护的工资
  • 做企业网站需要准备什么wordpress删除重复文章
  • 通道县城市建设投资有限公司网站黄石网站建设
  • 网上支付网站怎摸做asp企业网站开发技术
  • wordpress临时关站国外大气网站
  • 上海优化排名网站网站地图写法
  • 怎么用虚拟主机做网站哪些网站是用asp.net开发的
  • 做尾货的网站做网站建设怎么赚钱
  • 网站管理 官网网站大全软件
  • 专题网站建设的请示专业网站建设设计装饰
  • 极速网站制作滨江道做网站公司
  • 青岛网站设计价格中信建设有限责任公司企业邮箱
  • 十堰微网站建设报价重庆妇科医院排名大全
  • 知名网站有哪些?门户网站需要多少空间
  • vue.js合作做网站么今天刚刚的最新新闻
  • au网站怎么注册微博营销策划方案范文
  • 成都旅游网站曲靖企业网站
  • 山西推广型网站开发wordpress discuz用户
  • 企业门户网站模板分享大气的建筑公司名字
  • 营销型网站建设哪好肃北蒙古族自治县建设局网站
  • 电商网站建设的内容免费搜索引擎入口
  • 装修公司网站源码php快递网站制作
  • 深圳知名网站网站做的一般怎么评价
  • 成都网站设计说明书设计作品
  • 咸阳市城乡建设规划局网站网站的建设的公司出名
  • sql server做网站打广告推广怎么做
  • asp网站 上传空间安卓应用开发工程师
  • 咋样建设网站wordpress免邮箱 注册