我被这两个弄糊涂了。我学到的是抽象数据类型是数据类型的数学模型,它指定对象和操作这些对象的方法,而不指定对象和方法的实现细节。示例:抽象堆栈模型定义了一个具有推送和弹出操作的堆栈,用于在堆栈中插入和删除项。通过使用链接列表、数组或类,我们可以通过多种方式实现这一点。
现在,谈到抽象类的定义,它是一个父类,它有一个或多个没有定义的方法(实现?)并且不能实例化(就像我们不能实现抽象堆栈一样,如果不通过具体的数据结构定义堆栈的底层机制)。例如:如果我们有一个名为Mammal的抽象类,其中包含一个名为eats ()的函数,我们就不知道哺乳动物是如何进食的,因为哺乳动物是抽象的。尽管我们可以为奶牛定义eat(),但它是一种派生的哺乳动物类。这是否意味着哺乳动物充当adt,而奶牛类是哺乳动物adt的实现?
如果我错了就纠正我。任何帮助都会很感激的。
发布于 2018-02-17 09:56:45
摘要数据类型是数据类型的数学模型。 现在,关于抽象类的定义.
您需要区分理论数学模型和实际实现技术。
模型是由人们创建的,目的是以某种可理解的、广义的方式对问题进行推理。
同时,为了工作和完成工作,编写了实际的代码。
“抽象数据类型”是--一个模型。“抽象类”是一种编程技术,一些编程语言(C++、C#、Java)在语言级别上支持这种技术。
“抽象数据类型”使您可以思考和谈论解决问题的方法,而不让您的大脑超载不必要的(此时)实现细节。当您需要FIFO数据结构时,您只说“堆栈”,而不是“具有指向头节点的指针和能力的双链接列表”。
“抽象类”允许您编写代码一次,然后再重用它(因为这就是OOP代码重用的重点)。当您看到有几个类型有一个公共的接口和功能--您可以创建“一个抽象类”,并将其功能的交集放在内部,同时仍然能够依赖尚未实现的函数,这些函数将在稍后通过一些具体类型实现。这样,您只需编写一次代码,然后需要更改它--这只是进行更改的一个地方。
注:
尽管在C++ ISO标准中(至少在草案中)有一个注意事项:
注意:抽象类机制支持一般概念的概念,例如形状,实际上只能使用更多的具体变体,如圆形和方形。
但这只是一张纸条。真正的定义是:
如果一个类至少有一个纯的(也称为未实现的)虚拟函数,那么它是抽象的。
这就导致了明显的限制:
除了作为抽象类派生的类的子对象之外,不能创建抽象类的任何对象。
就我个人而言,我喜欢C++ (不像C#和C#)没有关键字“抽象”。它只具有类型继承和虚拟函数(这些函数可能仍未实现)。这有助于您专注于实际事项:在需要时继承,必要时重写。
总之,使用OOP -要务实。
发布于 2018-02-17 09:16:30
术语“抽象数据类型”与C++中的任何内容没有直接关系。因此,abstract class是在给定语言中实现抽象数据类型的潜在实现策略之一。但要做到这一点还有很多技术。
因此,abstract base classes允许您定义一组派生类,并向您保证所有接口(声明)也有一个实现,如果没有,编译器会抛出一个错误,因为您无法获得类的一个实例,因为缺少方法定义。
但是您也可以使用compile time polymorphism和相关技术(如CRTP )来具有抽象数据类型。
所以你必须决定你需要哪些功能,以及你想为此付出什么代价。Runtime polymorphism附带了vtable和vtable调度的额外成本,但也带来了late binding的好处。Compile time polymorphism带来了更好的可优化代码,执行速度更快,代码规模更小。如果接口没有实现,这两种方法都会给出错误,至少在链接器阶段。
但是具有多态性、独立于运行时或编译时间的抽象数据类型并不是1:1的关系。通过简单地定义一个必须在某个地方实现的接口,也可以使事物变得抽象。
简而言之:抽象数据类型不是在c++中直接表示的,抽象基类是一种c++技术。
发布于 2018-02-17 09:27:38
抽象类是抽象数据类型的示例吗?
是的,但是在C++中,抽象类已经成为抽象数据类型的一个越来越罕见的例子,因为泛型编程通常是一种更好的选择。
示例:抽象堆栈模型定义了一个具有推送和弹出操作的堆栈,用于在堆栈中插入和删除项。通过使用链接列表、数组或类,我们可以通过多种方式实现这一点。
C++ std::stack类模板或多或少是这样工作的。它有成员函数push和pop,它是按照默认为std::deque的Container类型参数实现的。
对于具有链接列表的实现,可以键入std::stack<int, std::list<int>>。但是,数组不能用于实现堆栈,因为堆栈可以增长和缩小,而且数组的大小是固定的。
理解std::stack与抽象类或运行时多态性完全无关是非常重要的。不涉及任何一个虚拟函数。
现在,谈到抽象类的定义,它是一个父类,它有一个或多个没有定义的方法(实现?)不能实例化
是的,这正是C++中抽象类的定义。
从理论上讲,这样的堆栈类可能如下所示:
template <class T>
class Stack
{
public:
virtual ~Stack() = 0;
virtual void push(T const& value) = 0;
virtual T pop() = 0;
};在这个例子中,元素类型仍然是泛型的,但是容器的实现是由一个具体的派生类提供的。这样的容器设计在其他语言中是惯用的,但在C++中则不然。
就像我们无法实现抽象堆栈一样,如果不通过具体的数据结构之一定义堆栈的底层机制,就无法实现抽象堆栈
是的,如果不提供容器类型参数,就不能使用std::stack (但无论如何这是不可能的,因为有默认的std::deque参数),您也不能实例化Stack<int> my_stack;。
https://stackoverflow.com/questions/48839522
复制相似问题