我很难接受这个概念。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版。
发布于 2013-12-15 21:06:56
您已经很好地理解了,具体类型是您可以创建实例的东西,而抽象类型则不是。例如,考虑典型的教学层次,例如:
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;
}您可以创建dog或cat的实例,因为它们是具体的,而不是抽象的。另一方面,您不能创建animal的实例,而只能持有指向一个实例的指针(或引用)。例如:
void hungry(animal *a) {
a->noise();
}按照Stroustrup正在使用的术语,animal的表示形式不包括在class animal的定义中。特定种类动物的表示在子类中描述,在这里可以是dog或cat。
发布于 2013-12-15 21:32:09
这似乎是BS使用的一个术语,其含义只有他才使用AFAIK。我不确定我是否完全理解他的意图。
发布于 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所描述的,只有在类类型按其实际类型(而不是其基类的类型)访问时才能实现。所以使用模式很重要。
https://softwareengineering.stackexchange.com/questions/221437
复制相似问题