首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >具体类型-如Stroustrup所述- C++编程语言第4版

具体类型-如Stroustrup所述- C++编程语言第4版
EN

Software Engineering用户
提问于 2013-12-15 20:06:27
回答 3查看 9.7K关注 0票数 10

我很难接受这个概念。Stroustrup在这得到了什么?一个“表示是其定义的一部分”的类有什么特别之处?“混凝土型”与之形成什么对比?(我假设它与“抽象类型”形成了对比,但由于AFAIK,您甚至不能将抽象类型的实例存在,很显然您无法将它放在堆栈中、初始化它,等等)。

是否有这样一个类我可以实例化,不适合这种描述的“具体的类”?通常我觉得BS很容易理解,但我忽略了这一点。

具体类的基本思想是,它们的行为“就像内置类型”。例如,复数类型和无限精度整数非常类似于内置int,当然,它们有自己的语义和操作集。类似地,向量和字符串很像内置数组,只是它们表现得更好(§4.2、§4.3.2、§4.4.1)。具体类型的定义特征是它的表示是其定义的一部分。在许多重要的情况下,例如向量,这种表示只是一个或多个指向存储在其他地方的多个数据的指针,但它存在于具体类的每个对象中.特别是,它允许我们将具体类型的对象放置在堆栈中、静态分配的内存中和其他对象中(§6.4.2);·直接引用对象(而不仅仅是通过指针或引用);·立即完全初始化对象(例如,使用构造函数;§2.3.2);以及·复制对象(§3.3)。Stroustrup,Bjarne (2013-07-10)。C++编程语言(第4版)(第16.3节具体类;Kindle 2373-2386)。皮尔逊教育。Kindle版。

EN

回答 3

Software Engineering用户

发布于 2013-12-15 21:06:56

您已经很好地理解了,具体类型是您可以创建实例的东西,而抽象类型则不是。例如,考虑典型的教学层次,例如:

代码语言:javascript
复制
class animal {
    virtual void noise() = 0;
}
class dog: public animal {
    void noise() { cout << "bark\n"; }
public:
    human *master;
}
class cat: public animal {
    void noise() { cout << "meow\n"; }
public:
    std::vector<human *> slaves;
}

您可以创建dogcat的实例,因为它们是具体的,而不是抽象的。另一方面,您不能创建animal的实例,而只能持有指向一个实例的指针(或引用)。例如:

代码语言:javascript
复制
void hungry(animal *a) {
    a->noise();
}

按照Stroustrup正在使用的术语,animal的表示形式不包括在class animal的定义中。特定种类动物的表示在子类中描述,在这里可以是dogcat

票数 7
EN

Software Engineering用户

发布于 2013-12-15 21:32:09

这似乎是BS使用的一个术语,其含义只有他才使用AFAIK。我不确定我是否完全理解他的意图。

  1. 首先,引用来自同一节:这类类型被称为具体类型或具体类,以区别于抽象类和类层次结构中的类。因此,对于他来说,抽象类的非抽象后代并不是一个具体的类(这不是我习惯的细微差别,我熟悉的用法是所有非抽象类都是具体的),至少如果继承不是实现细节的话。他的具体课程似乎是独立的实用工具。
  2. 我熟悉的另一个具体/抽象的二分法是数据结构。抽象数据结构是由它的操作(例如字典提供查找、插入、.)定义的。具体的数据结构说明了如何提供这些数据(例如哈希表)。他坚持认为表象是公开的,这可能与此有关(可能是因为表示法对复杂性的影响)。
  3. Stepanov和McJones在编程元素中使用了正则类型的概念。Stroustrup也使用了这个概念(在24.3.1节中),我不知道具体类型有什么区别。两个猜测:
    • 具体类型更多地是一个意图使用的概念,而不是严格的属性,而正则的概念是用来描述一个类型必须在泛型上下文中可用的属性。
    • 正则类型的概念是对一种具体类型的改进,当他引入它时,他没有看到它们应该是统一的(第二种描述中已经有了具体类型的描述,但似乎已经重写了)。
票数 4
EN

Software Engineering用户

发布于 2020-06-03 09:04:36

以下信息来自C++编程语言(第4版):

§3.2.1“具体类型的定义特点是,其表示是其定义的一部分”§16.3“,这类类型被称为具体类型或具体类,以区别于抽象类(§20.4)和类层次中的类(§20.3,§21.2)”§16.3“,如果类的表示是其定义的一部分,则称为具体类型(或具体类)。这区别于抽象类(§3.2.2,§20.4),抽象类为各种实现提供了接口。“§16.3.4:”特别是,具体类型不打算显示运行时多态行为(见§3.2.3,§20.3.2)“第3.2.3条和第20.3.2条的标题为“虚拟功能”§16.3.4:”或者,第20章中讨论的派生类机制可以通过描述期望的差异来定义具体类的新类型。向量中Vec的定义(§4.4.1.2)就是一个例子。但是,由于缺乏虚拟函数和运行时类型信息,应该谨慎地从具体类派生,而且很少这样做(第22章,第17.5.1.4节)。

将具体类型视为值类型的同义词。以价值为导向的编程与面向对象编程的某些方面不同。

具体类型不显示运行时多态行为。因此,对具有继承的具体类型的行为进行修改的手段是有限的。允许具体类型将其他类型聚合为成员变量。具体类型也可以继承其他具体类型。还允许具体类型使用空闲存储(堆)存储数据,并使用指针访问数据。

决定属性似乎是,具体类型没有任何虚拟函数。相反的类型--具有虚拟成员的类型--通常被称为多态类型(或者根据Microsoft C++文档,其他一些专家对引用类型的定义不同),因此具体类型是非多态的。

抽象类型总是多态类型,但通常情况并非如此。

具体类型通常是(半或)常规类型,在规则6中提供默认操作。

(然而,of首选项将所有可实例化的类(非抽象类)定义为具体类,而具体类可以继承抽象类(或作为抽象类的基础:https://en.cppreference.com/w/cpp/language/abstract_班级) )。

我不确定BS是否会将所有‘资源类型’(例如,网络套接字、文件、.,由RAII转换)视为具体类型,即使它们不是多态类型。资源类型通常不能被复制,有时需要特殊的初始化(非默认构造函数或更复杂的东西)。

我也不确定,BS是否会将具有虚拟函数的最终类或具有所有已完成(称为去虚拟化)的虚拟函数的类视为具体类:如果您有这种类型的变量,那么您知道哪些函数被称为(在类中定义的函数)--这些类型不再显示运行时多态行为。

为了便于讨论,也许我们应该区分实际实例化的类类型(动态类型)和在程序代码中访问该类的类型(静态类型)。具体类的属性,如BS所描述的,只有在类类型按其实际类型(而不是其基类的类型)访问时才能实现。所以使用模式很重要。

票数 1
EN
页面原文内容由Software Engineering提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://softwareengineering.stackexchange.com/questions/221437

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档