C++ 什么';C+中的接口与方法、抽象与封装+;

C++ 什么';C+中的接口与方法、抽象与封装+;,c++,oop,C++,Oop,当我和朋友讨论这些概念时,我感到困惑 我朋友的意见是正确的 1) 抽象是关于纯虚函数的 2) 接口不是成员函数,但接口是纯虚拟函数 发现,在C++底层中,接口是数据类型支持的操作,所以成员函数是接口。p> 我的意见是 1) 抽象是关于接口和实现的描述 2) 成员函数是接口 有人能帮我澄清一下这些概念吗 1) 抽象、抽象数据类型和抽象类之间的区别 2) 接口和成员函数之间的差异 P>3)抽象与封装的区别。< P>虚拟成员函数(不完全纯)与继承是一种表达C++接口概念的方法,即接口和方法是正交概念。

当我和朋友讨论这些概念时,我感到困惑

我朋友的意见是正确的

1) 抽象是关于纯虚函数的

2) 接口不是成员函数,但接口是纯虚拟函数

发现,在C++底层中,接口是数据类型支持的操作,所以成员函数是接口。p> 我的意见是

1) 抽象是关于接口和实现的描述

2) 成员函数是接口

有人能帮我澄清一下这些概念吗

1) 抽象、抽象数据类型和抽象类之间的区别

2) 接口和成员函数之间的差异

P>3)抽象与封装的区别。

< P>虚拟成员函数(不完全纯)与继承是一种表达C++接口概念的方法,即接口和方法是正交概念。p>

C++中另一种接口方法是泛型代码(即模板),在这里,您通常不期望任何具体类型——相反,您希望该类型具有特定语义的某些成员函数——如果它不会得到编译错误。 有些人称之为概念,而你所说的类型建模是一个特定的概念。虽然C++中没有概念支持,但是库可以很好地提供替代。p>

  • 抽象意味着有人可以在不知道实现细节的情况下使用您的代码。使这一点变得复杂的是,在一个上下文中属于实现细节的内容可能不在其他上下文中。抽象数据类型是无法实例化的数据类型,它只描述其子类型的属性。抽象类只是一种抽象数据类型和类

  • 一个接口可以由一组成员函数隐式定义(尽管要成为有用的抽象,这些函数至少应该是虚拟的,以便接口有多个可能的实现)。它也可以被明确定义为一个只有纯虚函数的类(在C++中)或一个
    接口(在Java、C#和D中)

  • 抽象是指你不必知道某件事情的实现细节。封装是指当您不能了解它们时。例如,一个从OO的角度进行了良好设计的类,但不需要将其成员变量设置为
    private
    ,它仍然是一个有用的抽象,但它没有被封装


  • 我认为你的主要问题是你和你的朋友使用了“界面”这个词的两种不同定义,所以你们在不同方面都是对的

    您使用的是日常意义上的“接口”,即“与某物交互的定义方式”,如“我的计算机和键盘之间的接口是USB”或“真空和墙壁电源之间的接口是插座”。从这个意义上说,是的,方法(甚至是具体的方法)是接口,因为它们定义了一种与对象交互操作的方式。这并不是说这不适用于软件——这是术语应用程序编程接口(API)中使用的“接口”的意思

    您的朋友使用的是更具体的面向对象编程术语中的“接口”,即“一个类可以选择以保证其支持的单独定义的操作集”。这里,“接口”的定义特征是它没有自己的实现。类应该通过提供接口定义的方法的实现来支持接口。由于C++在这个意义上没有明确的接口概念,等价结构是一个纯虚拟函数(抽象数据类型)的类。
    另一方面,“抽象”是关于很多事情的,而且你们都是对的。一般意义上的抽象意味着能够关注更高层次的概念,而不是更低层次的细节。封装是一种抽象,因为它的目的是隐藏类的方法的实现细节;实现可以在不更改类定义的情况下更改。纯虚拟函数(OO术语中的“接口”)是另一种抽象类型,因为如果使用得当,它们不仅可以隐藏实现,还可以隐藏真正的底层对象类型;只要两种类型实现相同的接口,所使用的类型就可以更改。

    相同的术语可以用于不同的事情,这就是这里发生的事情

    < C++中的“抽象”意味着一种根本没有实现的方法(不能用抽象成员实例化对象) “抽象”只是“建模”的概念。建模就是通过忽略一些细节使复杂的东西看起来更简单。在编程中,您希望将操作和概念分解为组件,对于每个组件,抽象出不影响当前组件操作的外部组件的详细信息

    编程“接口”是实现“抽象”的一种方式。与拥有组件的所有源代码和内部操作不同,您只看到与如何使用对象相关的操作。C++中的一个“接口”是通过将一个类上的所有方法标记为“抽象”(也称为“纯虚拟”)来实现的,这是通过在方法声明之后、在分号之前加上“=0”来完成的。该方法必须标记为“虚拟”才能合法

    P>一个抽象的C++类是一个至少有一个纯虚方法,并且通过使所有成员函数纯虚化,在C++中实现一个接口。 封装是一个模糊的术语,但对我来说,它意味着实现