C++中抽象类和接口的分别你知道多少?

【菜科解读】
抽象类(abstract class)和接口(interface)的概念是面向对象设计中常用的概念, 也是比较容易混淆的概念. 在这里, 我提出一种区分它们的思路:1. 如果一个类B在语法上继承(extend)了类A, 那么在语义上类B是一个类A.2. 如果一个类B在语法上实现了(implement)接口I, 那么类B遵从接口I制定的协议.------------------------------------------------------------------------------------------------使用abstract class的根本原因在于, 人们希望通过这样的方式, 表现不同层次的抽象. 而interface的本质是一套协议. 在程序设计的发展中, 人们又发现接口可以用来表示对行为的抽象, 不过, 这只是interface的一种用法不是其本质.------------------------------------------------------------------------------------------------理论结合实际才是最好的学习方式, 不过在这里, 我只想举一些我见到过关于接口使用的反面教材:1. 在接口中包含数据成员. 这几乎肯定是错的, 因为协议是规范是标准, 不应该跟具体实现有任何牵连, 也不应该给具体实现造成任何负担.2. C++中 delete 掉一个接口. 例如:class IInterface() { Public: Virtual ~IInterface(){}; … } Class ClassImpl : public IInterface { … } Int main() { IInterface* pInterface = new ClassImpl(); … delete pInterface; } 从语法的角度和语言自身的角度来看, 这是可行的, 而且只要将接口的析构函数设置为virtual, 就能避免内存泄漏. 但我要说, 这不是语法和语言的问题, 而是从根本上就错了. 因为接口是一套协议, 一套规范, 并不是实现. Delete 一个接口的代码, 到底想要表达什么样的语义? 如果一段代码从语义上都说不通, 就不应该出现在程序中.要在C++中表现接口的概念, 一种做法是这样:class IInterface { public: virtual void DoSomething() = 0; } // 不应当有析构函数, 因为从语义上说, 接口是不能delete的. 如果要delete, 只能delete一个类的实例:Class A { Public: Virtual ~A(); Public: Virtual void DoSomething() = 0; } Class B : public A { … } Int main() { A* pA = new B(); … Delete pA; } 我们可以这样做, 因为pA对应的是一个实例, 我们可以在A这一层将其销毁.
先举个例子,方便大家理解,然后从例子中抽象概括出结理论。
比如,一家生产门的公司,需要先定义好门的模板,以便能快速生产出各种规格的门。
这里的模板通常会有两类模板:抽象类模板和接口模板。
抽象类模板:这个模板里面应该包含所有门都应该具有的共同属性(如,门的形状和颜色等)和共同行为(如,开门和关门)。
接口模板:有些门可能需要具有报警和指纹识别等功能,但这些功能又不是所有门必须具有的,所以像这样的行为应该放在单独的接口中。
有了上面的两类模板,以后生产门就很方便了:利用抽象类模板和包含了报警功能的接口模板就能生产具有报警功能的门了。
同理,利用抽象类模板和包含了指纹识别功能的接口模板就能生产具有指纹识别功能的门了。
总之:抽象类用来抽象自然界一些具有相似性质和行为的对象。
而接口用来抽象行为的标准和规范,用来告诉接口的实现者必要按照某种规范去完成某个功能。
这是我自己的看法,欢迎大家和我探讨这个问题。
C++,中,抽象,类和,接口,的,区别,你,知道,多少,意大利军队的实力本来并不错,为什么在第二次世界大战中的表现那么差劲
“沙漠煮通心粉”“撬不开弹药箱投降”“空军元帅被己方军舰击落”等搞笑事迹广为流传,被人们戏称为“专门来拖德国后腿”的军队。
(意大利远征军) 虽然有这么多笑话,但实际上,意大利军队的实力并不错。
为什么说不弱呢? 比如苏德战争中,意大利远征军出兵攻打乌克兰,俘虏了10万苏军。
再比如在北非战场上,由于英国第22装甲师拒绝意大利的投降,愤怒的意大利军队提枪反击,将高傲的英国人打的大败而归。
另外,在格勒战役中,面对苏联两大突击集团的攻击,轴心国集团军已经山穷水尽,只得被迫突围。
当时的苏军在顿河区域部下了巨大的包围圈,称之为“顿河口袋”,能突破的轴心国部队少之又少,不过,却有一支意大利军队却突围了。
而且最厉害的是,意大利军队是用刺刀活生生地拼出了一个缺口,硬是让4000人突破成功,其他人则全部战死。
那么,既然意大利军队是有实力的,为什么在二战中,整体表现却那么差呢? 要搞清楚这个问题,就先要搞清楚所谓的强弱是怎么区分的。
(二战中的意大利军) 其实,意大利军队比起自己入侵的非洲土著国家埃塞俄比亚,肯定是强大的,不仅装备上全面碾压,补给和军队的作战素质也比对手高出一大截。
但若是比起自己的盟友,一个前期天下无敌的德国,另一个四面征战的日本,意大利军队就相形见绌了。
而且不仅仅是队友,意大利在二战中的主要对手英国也扛起了拯救欧洲的重任,表现非常出色。
由于盟友德国的强势,意大利陆军在战争中,大部分时间都在充当后勤、掩护、后卫等一系列的苦差事,。
也就是说,意大利之所以给人一种在二战中非常糟糕的感觉,主要是由于队友和对手的双面衬托,这也是人们从主观上得出的一种判断。
当然了,从客观上来说,意大利军队也确实存在一些问题。
首先就是意大利人对待战争的态度。
意大利军队之所以要参加二战,很大一部分原因是由于的命令,意大利士兵自身是对战争并没有多大兴趣的。
(墨索里尼旧照) 而墨索里尼实际上也只是一个投机份子。
比起战争狂,墨索里尼想要的,只不过是能在战争中分一杯羹,并没有什么称霸世界的野心,而且也确实没有那个实力。
因此,意大利实际上上上下下对战争都兴致不高,更多的是去战场上走个过场,露露面,以期战后能分到一些好处。
毕竟当意大利军队决定参战时,正是德国陆军横扫欧洲的时候。
追随胜利者,并不是一个错误的决定。
而从英国不允许他们投降和斯大林格勒中的突围能够看出,意大利人虽然是去打个酱油,但一旦真的威胁到了自身生命,他们也会爆发出强悍的战斗力。
除了对待战争态度消极,还有一个原因。
意大利虽然在一战中是战胜国,但却并没有捞到多少油水,反而自身搞得负债累累,经济发展情况不佳。
尤其是工业产能方面更加不足。
换言之,意大利选择打酱油,是他们真实实力的体现。
凭那样的国力,他们实在不具备与强国扳手腕的能力。
随机文章日本干细胞再生人体器官,万能干细胞(生命的源头)埃及出土木乃伊是无价之宝,为制作木乃伊而掏空内脏美国总统提出的肥皂水效应,用赞扬的方式批评别人(效果更佳)希尔夫妇被外星人绑架事件,外星人绑架人类做研究/真实事件路飞第几集吃光明果实,网络谣言/路飞靠橡胶果实通关(被掏空)
Execl2010中的COUNTIFS函数运用
例如:需要计算美国报名人数超过20人的城市数量。
操作方法 1、选定单元格,输入函数。
COUNTIFS函数的格式为:COUNTIFS(criteria_range1,criteria1…) 2、“criteria_range1”表示条件1的范围,本例中条件1的范围是“国家”列,用“A3:A11”表示。
3、“criteria1”表示条件1,条件1为“国家是美国”,用”美国”表示。
4、“criteria_range2”表示条件2的范围,本例中条件2的范围为“报名人数”列,用“C4:C11”表示;“criteria2”表示条件2,本例中条件2为“报名人数超过20人”,用”>20”表示。
5、最后得出美国报名人数超过20人的城市数的结果,如下图所示。
Execl2010,中的,COUNTIFS,函数,运用,该,