c++中抽象类与接口的区别

转载 2013年12月03日 15:19:17
其实对抽象类与接口的区别一直是搞不太清楚,最近正在学习《设计模式》,期间用到了很多c++多态的知识。这是才恍然发现,是应该整理下这方面的知识了。但在翻阅书本、上网查阅资料之际,发现有篇文章总结的不错。于是,转载(博主勿怪)并稍作修改如下:

抽象类:抽象类是特殊的类,只是不能被实例化(将定义了一个或多个纯虚函数的类称为抽象类);除此以外,具有类的其他特性;重要的是抽象类可以包括抽象方法,这是普通类所不能的,但同时也能包括普通的方法。抽象方法只能声明于抽象类中,且不包含任何实现,派生类必须覆盖它们。另外,抽象类可以派生自一个抽象类,可以覆盖基类的抽象方法也可以不覆盖,如果不覆盖,则其派生类必须覆盖它们。虽然不能定义抽象类的实例,但是可以定义它的指针,并且指向抽象类的指针实际上在赋值时是指向其继承类的实例化对象的,这样通过统一的使用该指针可以很好的封装不同子类的实现过程,这在模式设计的过程中得到了极大的应用!

接口:接口是一个概念。它在C++中用抽象类来实现,在C#和Java中用interface来实现。

接口是引用类型的,类似于类,和抽象类的相似之处有三点:

       1、不能实例化;
       2
、包含未实现的方法声明;
        3
、派生类必须实现未实现的方法,抽象类是抽象方法,接口则是所有成员(不仅是方法包括其他成员);

  另外,接口有如下特性:
接口除了可以包含方法之外,还可以包含属性、索引器、事件,而且这些成员都被定义为公有的。除此之外,不能包含任何其他的成员,例如:常量、域、构造函数、析构函数、静态成员。一个类可以直接继承多个接口,但只能直接继承一个类(包括抽象类)。

抽象类和接口的区别:
      1.
接口和抽象类的概念不一样。接口是对动作的抽象,抽象类是对根源的抽象。抽象类表示的是,这个对象是什么。接口表示的是,这个对象能做什  么。比如,男人,女 人,这两个类(如果是类的话……),他们的抽象类是人。说明,他们都是人人可以吃东西,狗也可以吃东西,        你可以把  东西定义成一个接口,然后让这些类去实 现它.所以,在高级语言上,一个类只能继承一个类(抽象类)(正如人不可能同时     是生物和非生物),但      是可以实现多个接口(吃饭接口、走路接口)

     2.抽象类在定义类型方法的时候,可以给出方法的实现部分,也可以不给出;而对于接口来说,其中所定义的方法都不能给出实现部分
      3.
继承类对于两者所涉及方法的实现是不同的。继承类对于抽象类所定义的抽象方法,可以不用重写,也就是说,可以延用抽象类的方法;而对于接口类所定义的方法或者属性来说,在继承类中必须要给出相应的方法和属性实现。  
      4.
接口可以用于支持回调,而继承并不具备这个特点.     
      5.
抽象类不能被密封,一个类一次可以实现若干个接口,但是只能扩展一个(抽象类)父类  ;。   
      6.
抽象类实现的具体方法默认为虚的,但实现接口的类中的接口方法却默认为非虚的,当然您也可以声明为虚的
      7.
(接口)与非抽象类类似,抽象类也必须为在该类的基类列表中列出的接口的所有成员提供它自己的实现。但是,允许抽象类将接口方法映射到抽象方法上。   
      8.
抽象类实现了oop中的一个原则,把可变的与不可变的分离。抽象类和接口就是定义为不可变的,而把可变的座位子类去实现。   
      9.
好的接口定义应该是具有专一功能性的,而不是多功能的,否则造成接口污染。(如果一个类只是为实现了这个接口的中一个功能,而但是却不得不去实现接口中的其他方法,就叫接口污染。   
     10.
尽量避免使用继承来实现组建功能,而是使用黑箱复用,即对象组合。因为继承的层次增多,造成最直接的后果就是当你调用这个类群中某一          类,就必须把他们全部加载到栈中!后果可想而知.(结合堆栈原理理解)。同时,有心的朋友可以留意到微软在构建一个类时,很多时候用       到了对象组合的方法。比如asp.net中,Page类,有Server Request等属性,但其实他们都是某个类的对象。使用Page类的这个对象来调       用另外的类的方法和属性,这个是非常基本的一个设计原则。   
     11.
如果抽象类实现接口,则可以把接口中方法映射到抽象类中作为抽象方法而不必实现,而在抽象类的子类中实现接口中方法.

转载地址:http://blog.csdn.net/bmzyDream_007/article/details/4157560

 

接口

抽象类

多继承

支持

不支持

类型限制

没有

有,只能是引用类型

方法实现

继承类型中必须给出方法实现

继承类中可以不给出

扩展性

比较麻烦

相对比较灵活

多层继承

比较麻烦,需要借助虚函数

比较灵活

 

C++中抽象类和接口类的区别

(源自:http://blog.sina.com.cn/s/blog_49652a2d0100fk3n.html) Bill Venners: 我在1991至1996这5年间,几乎一直仅仅使用C+...
  • u012575899
  • u012575899
  • 2014年04月14日 20:11
  • 1992

C++中抽象类与接口的区别

一、抽象类和接口 抽象类:  抽象类是特殊的类,不能被实例化(将定义了纯虚函数的类称为抽象类);除此以外,具有类的其他特性; 重要的是抽象类可以包括抽象方法,这是普通类所不能的,但同时也能...
  • fandongguang0702
  • fandongguang0702
  • 2016年06月26日 10:47
  • 535

C++的抽象类详解

在介绍抽象类之前,我们先介绍一下纯虚函数。 1.纯虚函数   在基类中仅仅给出声明,不对虚函数实现定义,而是在派生类中实现。这个虚函数称为纯虚函数。普通函数如果仅仅给出它的声明而没有实现它的函数体,这...
  • lidiya007
  • lidiya007
  • 2016年11月18日 18:39
  • 8476

C++中的抽象类以及接口的区别联系

一、抽象类和接口 抽象类: 抽象类是特殊的类,不能被实例化(将定义了纯虚函数的类称为抽象类);除此以外,具有类的其他特性; 重要的是抽象类可以包括抽象方法,这是普通类所不能的,但同时也能包括普通的方...
  • Hackbuteer1
  • Hackbuteer1
  • 2012年05月11日 22:58
  • 19018

C++ 抽象类

抽象类是为了抽象和设计的目的而建立的,处于继承层次结构的上层。 具体类是能够建立对象的类。 抽象类的规定 (1)抽象类只能用作其他类的基类,不能建立抽象类对象。 (2)抽象类不能用作参数类型、...
  • Slience_Perseverance
  • Slience_Perseverance
  • 2014年03月05日 13:58
  • 26164

c++中的抽象类

在面向对象的编程过程中,有些类的创建是毫无意义的,它的概念是抽象的,比如动物,电器,人这样类,比如到商店给店员说我要买一台电器。编程过程中可以将这些类设置为抽象类,以防止它们创建对象。 只要...
  • uestclr
  • uestclr
  • 2016年06月10日 11:39
  • 1102

接口和抽象类有什么区别

接口和抽象类有什么区别 你选择使用接口和抽象类的依据是什么? 接口和抽象类的概念不一样。接口是对动作的抽象,抽象类是对根源的抽象。 抽象类表示的是,这个对象是什么。接口表示的是,这个对象...
  • fenglibing
  • fenglibing
  • 2008年07月31日 12:54
  • 151655

C++抽象类小览

virtual 方法和 virtual 类可以说是c++语言的一大特性,甚至有人说是c++语言的精髓,其实这么说也是有一定道理的,因为运行时多态在c++中体现淋漓尽致,而 virtual 就是为多态服...
  • Scythe666
  • Scythe666
  • 2015年08月02日 09:23
  • 1173

java的接口和C++虚类的相同和不同之处

C++虚类相当于java中的抽象类,与接口的不同之处是:      1.一个子类只能继承一个抽象类(虚类),但能实现多个接口      2.一个抽象类可以有构造方法,接口没有构造方法 ...
  • chwshuang
  • chwshuang
  • 2015年07月18日 16:35
  • 2551

C++抽象类

如果声明了一个类,一般可以用它定义对象。但是在面对对象程序设计中,往往有一些类,它们不用来生成对象。定义这些类的唯一目的就是用它作为基类去建立派生类。抽象类是为了抽象和设计的目的而建立的,处于继承层次...
  • m_hahahaha1994
  • m_hahahaha1994
  • 2016年07月19日 18:33
  • 333
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:c++中抽象类与接口的区别
举报原因:
原因补充:

(最多只允许输入30个字)