C ++上下文中的抽象和接口有什么区别?

时间:2014-11-03 12:51:28

标签: c++ design-patterns

C ++中的接口实现为抽象类,即纯虚方法。 类似地,C ++中的抽象类也以相同的方式实现。我可以说C ++中的接口和抽象是相同的,除了接口可能是动词的概念 - 行为和抽象类是名词。我的理解是对的吗?我问这个问题,因为设计模式 - 谈论界面和抽象不同。另外,原因是JAVA有两个不同的关键词 - 界面和抽象。我们需要在java中实现接口。我们需要扩展抽象类。但是,在CPP中,我们只从抽象类继承然后实现。

6 个答案:

答案 0 :(得分:1)

正如您所说,C ++中的接口是使用具有纯虚函数的抽象类实现的。任何具体(即非抽象)派生类都必须覆盖纯虚函数。通过将expression = 0添加到虚函数,我们指出虚函数是纯虚函数。抽象类是一个包含至少一个纯虚函数的类。

例如:

class AbstractBase {
    public:
      const char* Hello() { return "Hello World!"; } // a normal non-virtual function    

      virtual void Method_1() {} // a normal virtual function

      virtual int Method_2() = 0; // a pure virtual function makes AbstractBase class not instantiable
  };  

class InterfaceBase {
    public:
      const char* Hello() = 0; // a pure virtual function    

      virtual void Method_1() = 0; // a pure virtual function

      virtual int Method_2() = 0; // a pure virtual function 
  };

答案 1 :(得分:0)

不,抽象类可以为方法提供默认行为;接口是纯虚拟的,不能。这根本不同。

  

行为和抽象类是名词

这没有任何意义。行为总是动词。

抽象类和接口的重点是多态性:不同的行为取决于运行时类型。

答案 2 :(得分:0)

如果它的所有方法都是抽象的,并且没有数据成员,那么C ++类确实是接口。但是,如果一个类至少有一个抽象方法,则它已经是抽象的。仍然可以有其他虚拟功能,非虚函数和数据成员的定义。这些都不属于接口。

答案 3 :(得分:0)

Java为interface类具有特定语法的原因(或原因)是因为Java不支持多重继承(非接口类)。

另一方面,C ++支持多重继承,因此不需要在语言级别定义接口类。

如果c ++类至少有一个纯虚拟成员函数,则它是抽象的。在OO设计中,没有方法实现的类称为接口。因此,考虑到这一观点,虽然语言中没有特殊的语法,但c ++中的接口只是一个抽象类,它没有非虚拟的成员函数,即所有成员函数都是纯虚拟的。因此,接口类是抽象类的子集,而不是你提出的相同的东西。

当然, interface 这个词比界面类的上下文中的含义更多。例如,您通常会认为库的接口是该库的头文件中定义的所有内容。这包括所有类定义,函数,全局变量及其文档。

答案 4 :(得分:0)

您面临的问题主要是因为“经典的OOP术语”是独立于C ++语言开发的,而且 - 转而 - 不是OOP纯语言。

尽管如此,在许多编程课程中,有一种历史趋势是通过OOP教授C ++,从而迫使OOP范式转换为C ++,即使C ++范例更广泛。

在纯OOP术语中,“接口”表示“描述外部行为”(与“实现”相反),而“抽象”表示“描述更高层次的东西”(与“具体”相反)

Il语言就像Java一样,其中OOP替换是使用专为那种设计而设计的继承实现的,“接口”是“抽象”,而类是“越来越具体”,就像在对象层次结构中一样。 / p>

C ++继承是不同的:它具有 - 非常基础 - 与OOP替换和java继承无关,不需要方法是虚拟的,并且可以是多个。在一般范式意义上,它只是一种聚合机制,可用于将事物放在一起。

您可以用它描述的问题集比OOP本身解决的问题要宽,同时也不包括所有Java问题。但如果你强迫自己进入某种纪律,你仍然可以适应它们。

因此:

  • 具有所有纯虚拟方法(virtual method(params)=0)和虚拟构造函数的类,从OOP角度查看 播放 界面
  • 一个实现了所有虚拟继承方法的类 就像 一个实现。

但C ++也承认所有中间案例(其中只实现了某些方法),并承认实现的起源不仅来自继承祖先树的相同路径。

事实上,C ++承认一个完整的“多重继承方案”,而java承认“部分多重继承”,只有一个类和许多接口(这就像说所有实现的方法必须来自树的同一侧)

你可以强制C ++遵守与java相同的规则,允许(人为地,此时)只有一个继承的基类可以提供方法,而所有其他只能声明它们,并且将“class”称为第一个和“界面“其他人。

但从语言角度来看,它们之间没有概念上的区别。

答案 5 :(得分:0)

以这种方式考虑:有两种类型的功能

  1. Concrete - 具有一些代码且实际执行任务的人。
  2. Virtual - 没有任何代码的一个,并根据该类的本地需要被其他一些具体类覆盖。通过在其声明中放置“= 0”来指定虚函数。
  3. 现在,interface是一个空shell,其中所有函数都必须是虚函数。它只是一个模式。程序员可以通过覆盖它的虚函数来完全修改它。

    但是,abstract class是一个只由程序员部分实现的类。也就是说,它必须至少有一个虚函数,但不一定都是。