我们在这先看一道牛客网上的题目
我们先分析一下这道题
- A:所谓的抽象类是指包含纯虚函数的抽象类,和普通的抽象类含不一样。而实现接口的类中的接口方法却默认为非虚的。纯虚函数可参见博客 C++之多态相关介绍
- B:一个类可以直接继承多个接口,但只能直接继承一个类(包括抽象类),所以B是正确的。
- C:我们都知道一个包含纯虚函数的类是不能定义对象的,因此接口不能被实例化是对的。
- D:接口即只包含纯虚函数的抽象类,所以是不能包含已经实现的方法的。
其实我认为这题有点问题。c++中虽然将抽象类称为接口类,但是抽象类和接口还是有区别的参考了一下大佬的博客 抽象类和接口的区别 ,下面我根据自己学到的具体讲一下抽象类和接口的区别
抽象类:
- 抽象类是特殊的类,不能被实例化(将定义了纯虚函数的类称为抽象类);除此以外,具有类的其他特性;
- 我们可以说,其实虚函数是一种强制派生类重写虚函数的机制,因为派生类若不重写虚函数,则无法实例化出对象。
- 抽象类,描述世界上一些比较泛化不具体的类型,这些类型找不出具体的对象,如人,动物,是一些比较宽泛的类。
- 重要的是抽象类可以包括抽象方法,这是普通类所不能的,但同时也能包括普通的方法。抽象方法只能声明于抽象类中,且不包含任何实现,派生类必须覆盖它们。
- 另外,抽象类可以派生自一个抽象类,可以覆盖基类的抽象方法也可以不覆盖,如果不覆盖,则其派生类必须覆盖它们。虽然不能定义抽象类的实例,但是可以定义它的指针,这正是用抽象类实现接口的重点所在。
接口
-
接口是一个概念。它在C++中用抽象类来实现,在C#和Java中用interface来实现。
-
接口是引用类型的,类似于类,和抽象类的相似之处有三点:
1、不能实例化;
2、包含未实现的方法声明;
3、派生类必须实现未实现的方法,抽象类是抽象方法,接口则是所有成员(不仅是方法包括其他成员); -
接口有如下特性:
-
接口除了可以包含方法之外,还可以包含属性、索引器、事件,而且这些成员都被定义为公有的。除此之外,不能包含任何其他的成员,例如:常量、域、构造函数、析构函数、静态成员。==一个类可以直接继承多个接口,但只能直接继承一个类(包括抽象类)
抽象类和接口的区别:
- 1、类是对对象的抽象,可以把抽象类理解为把类当作对象,抽象成的类叫做抽象类.而接口只是一个行为的规范或规定,微软的自定义接口总是后带able字段,证明其是表述一类“我能做…”的类,抽象类更多的是定义在一系列紧密相关的类间,而接口大多数是关系疏松但都实现某一功能的类中。接口实现了高内聚低耦合的特点。
- 2、接口基本上不具备继承的任何具体特点,它仅仅承诺了能够调用的方法;
- 3、一个类一次可以实现若干个接口,但是只能扩展一个父类 。
- 4、接口可以用于支持回调,而继承并不具备这个特点。
- 5、抽象类不能被密封,抽象类对派生类是可见的,属于白箱复用。
- 6、抽象类实现的具体方法默认为虚的,但实现接口的类中的接口方法却默认为非虚的,当然您也可以声明为虚的。
- 7、(接口)与非抽象类相似,抽象类也必须为在该类的基类列表中列出的接口的所有成员提供它自己的实现。但是,允许抽象类将接口方法映射到抽象方法上。
- 8、抽象类实现了oop中的一个原则,把可变的与不可变的分离。抽象类和接口就是定义为不可变的,而把可变的作为子类去实现。
- 9、好的接口定义应该是具有专一功能性的,而不是多功能的,否则造成接口污染。如果一个类只是实现了这个接口的中一个功能,而不得不去实现接口中的其他方法,就叫接口污染。
- 10、尽量避免使用继承来实现组建功能,而是使用黑箱复用,即对象组合。组合和继承的区别可参见博客 C++之继承与组合
- 11、如果抽象类实现接口,则可以把接口中方法映射到抽象类中作为抽象方法而不必实现,而在抽象类的子类中实现接口中方法。