Ada 中的标记类型是什么?
What is a tagged type in Ada?
目前正在学习 Ada 并且很喜欢它,有一点困扰我:什么是 tagged
类型?根据 John Barnes 的 Programming in Ada 2012,它表示实例化对象在 运行 时间携带标签。
我认为在 C++ 或 C 中我从未听说过类似的东西,所以我有点迷茫。它是什么?我什么时候需要它(显然是为了拥有方法和继承?)?
简直就是一个class。这是 Ada 中声明 class 层次结构根的一种方式。另一种方法是使用接口。
目前,这也是获取类型的点符号的方法(但这将在 Ada 2022 中推广)。
所以你很少直接操作标签,就像 vtables 在幕后提供调度一样,但你不需要在 C++ 中考虑它们。
与这些语言的一个显着区别是 T'Class
可以用来指代整个派生类型家族,并且必须显式使用它才能实现动态调度。
Ada 中的标记很像 C++ 中的虚函数Table指针。也就是说,标记类型是具有此类型的类型。
虚函数 Table 指针一旦声明为第一个 virtual
函数,就会在 structure/class 中分配。在 Ada 中,您只需显式声明即可。
Ada 的 Tag 和 C++ 的 VFTPtr 都可以进行动态调度。
目前正在学习 Ada 并且很喜欢它,有一点困扰我:什么是 tagged
类型?根据 John Barnes 的 Programming in Ada 2012,它表示实例化对象在 运行 时间携带标签。
我认为在 C++ 或 C 中我从未听说过类似的东西,所以我有点迷茫。它是什么?我什么时候需要它(显然是为了拥有方法和继承?)?
简直就是一个class。这是 Ada 中声明 class 层次结构根的一种方式。另一种方法是使用接口。
目前,这也是获取类型的点符号的方法(但这将在 Ada 2022 中推广)。
所以你很少直接操作标签,就像 vtables 在幕后提供调度一样,但你不需要在 C++ 中考虑它们。
与这些语言的一个显着区别是 T'Class
可以用来指代整个派生类型家族,并且必须显式使用它才能实现动态调度。
Ada 中的标记很像 C++ 中的虚函数Table指针。也就是说,标记类型是具有此类型的类型。
虚函数 Table 指针一旦声明为第一个 virtual
函数,就会在 structure/class 中分配。在 Ada 中,您只需显式声明即可。
Ada 的 Tag 和 C++ 的 VFTPtr 都可以进行动态调度。