c++ - 抽象类是抽象数据类型的一个例子吗?

标签 c++ polymorphism abstract-class adt

我对这两个感到困惑。我学到的是,抽象数据类型是数据类型的数学模型,它指定了对象和操作这些对象的方法,而不指定对象和方法的实现细节。例如:抽象堆栈模型定义了一个堆栈,其中包含推送和弹出操作,用于向堆栈插入项目和从堆栈删除项目。我们可以通过多种方式实现这一点,例如使用链表、数组或类。

现在,来到抽象类的定义,它是一个父类,它有一个或多个没有定义(实现?)并且不能被实例化的方法(就像我们不能实现一个抽象堆栈一样,因为它是,没有通过具体数据结构之一定义堆栈的底层机制)。例如:如果我们有一个名为 Mammal 的抽象类,其中包含一个名为 eat() 的函数,我们不知道哺乳动物是如何进食的,因为哺乳动物是抽象的。虽然我们可以为奶牛定义 eat(),它是哺乳动物的派生类。这是否意味着 mammal 充当 adt 而 cow 类是 mammal adt 的实现?

如果我有任何错误,请纠正我。任何形式的帮助将非常感激。

最佳答案

Abstract data type is a mathematical model for data type...

Now, coming to the definition of abstract class...

您需要区分理论数学模型和实际实现技术。

模型是由人们创建的,目的是为了以某种可理解的、概括的方式轻松地推理问题。

与此同时,编写实际代码是为了工作并完成工作。

“抽象数据类型”是模型。 “抽象类”是一些编程语言(C++、C#、Java)在语言层面上支持的一种编程技术

“抽象数据类型”让您可以思考和讨论问题的解决方案,而不会让您的大脑因不必要的(此时)实现细节而重载。当您需要 FIFO 数据结构时,您只说“堆栈”,而不是“带有指向头节点的指针和...能力的双向链表”.

“抽象类”让您编写代码一次,然后再重用它(因为这就是 OOP 的要点 - 代码重用)。当您看到几种类型具有共同的接口(interface)和功能时 - 您可以创建“抽象类”并将它们的功能交集放在里面,同时仍然能够依赖尚未实现的功能,这些功能将由一些具体类型实现之后。这样,您只需编写一次代码,以后需要更改它时 - 只需在一个地方进行更改。

注意:
尽管在C++ ISO 标准(至少在草案中)有注释:

Note: The abstract class mechanism supports the notion of a general concept, such as a shape, of which only more concrete variants, such as circle and square, can actually be used.

但这只是一个注释。真正的定义是:

A class is abstract if it has at least one pure (aka unimplemented) virtual function.

这导致明显的限制:

no objects of an abstract class can be created except as subobjects of a class derived from it

就个人而言,我喜欢 C++(与 C# 和 Java 不同)没有关键字“抽象”。它只有类型继承和虚函数(可能仍未实现)。这有助于您专注于实际问题:在需要的地方继承,在需要的地方覆盖。

简而言之,使用 OOP - 务实。

关于c++ - 抽象类是抽象数据类型的一个例子吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48839522/

相关文章:

c++ - 单个变量的线程安全

c++ - 使用 Homebrew 软件在 Mac 上安装 openmp

java - 这个对方法的调用是如何在 java 的继承中解决的?

c++ - 派生类对象的地址超过 1 个?

php - 在 Yii2 中以多态方式从数据库中查找模型

java - 如何实现使用父类数据成员的抽象函数

c# - 使用其类型的向下转型实例

c++ - 具有更多模板参数的模板友元类

java - 为什么我会收到未检查的作业警告?

c++ - std::rel_ops 功能作为基类。那是合适的解决方案吗?