具有虚拟继承的编译时子类字节偏移量
Compile time subclass byte-offset with virtual inheritance
是否可以在编译时计算继承层次结构中虚基的字节偏移量?
例子-
class A {};
class B : public virtual A {};
class C : public virtual A {};
class D : public virtual B, public virtual C {};
我想计算 B
、C
和 D
w.r.t 实例的字节偏移量。 A
在编译时 即不使用这些 类.
的任何 真实 实例
根据我目前在网上阅读的内容,编译器在虚拟 table 的帮助下实现逻辑(由 static_cast 和 dynamic_cast 使用)并且因为没有 true 这些 类 中任何一个的实例都没有虚拟 table 可以搭载。但希望有一些模板魔法可以使这项工作成功。
目的 - 我试图让这个 Custom RTTI 实现与虚拟继承一起工作。
Is it possible to compute, at compile time, the byte offset of a virtual base in an inheritance hierarchy?
不是,因为不同的对象实例是不同的。它不是 class 的 属性。
让我们看看你的例子。 B
有一个虚拟基地 class A
。所以 B
必须有一些字节偏移到 A
。 C
.
也是如此
但是,D
通过 B
和 C
继承了虚拟 A
。 virtual
继承的全部意义在于,如果您继承相同的基 class,那么到达该基 class 的所有路径都将引用 相同的子对象 的动态类型。所以 D
只有一个 A
.
的实例
但是它在哪里呢? B
和 C
使用的偏移量不可能 都 是正确的。除非...偏移量本身存储在vtable中。
虚拟继承(基本上)是这样工作的。当您创建 D
时,D
负责分配所有 virtual
ly 继承的对象的位置。这些偏移量将不同于您创建动态类型为 B
或 C
.
的对象时的偏移量
没有办法做你想做的事。并非没有实际创建对象的实例。虽然 C++20 确实允许您在编译时创建虚拟类型的实例(只要它们具有可行的 constexpr
构造函数,所以您不能对所有事情都这样做),您仍然不能做您想要的需要。如果您有指向两种不同类型的指针,要计算它们之间的字节偏移量,您必须 reinterpret_cast
将这些指针转换为整数或 unsigned char*
。 reinterpret_cast
在编译时被禁止(当给定指针类型或包含指针的类型时,bit_cast
不是 constexpr
)。
是否可以在编译时计算继承层次结构中虚基的字节偏移量?
例子-
class A {};
class B : public virtual A {};
class C : public virtual A {};
class D : public virtual B, public virtual C {};
我想计算 B
、C
和 D
w.r.t 实例的字节偏移量。 A
在编译时 即不使用这些 类.
根据我目前在网上阅读的内容,编译器在虚拟 table 的帮助下实现逻辑(由 static_cast 和 dynamic_cast 使用)并且因为没有 true 这些 类 中任何一个的实例都没有虚拟 table 可以搭载。但希望有一些模板魔法可以使这项工作成功。
目的 - 我试图让这个 Custom RTTI 实现与虚拟继承一起工作。
Is it possible to compute, at compile time, the byte offset of a virtual base in an inheritance hierarchy?
不是,因为不同的对象实例是不同的。它不是 class 的 属性。
让我们看看你的例子。 B
有一个虚拟基地 class A
。所以 B
必须有一些字节偏移到 A
。 C
.
但是,D
通过 B
和 C
继承了虚拟 A
。 virtual
继承的全部意义在于,如果您继承相同的基 class,那么到达该基 class 的所有路径都将引用 相同的子对象 的动态类型。所以 D
只有一个 A
.
但是它在哪里呢? B
和 C
使用的偏移量不可能 都 是正确的。除非...偏移量本身存储在vtable中。
虚拟继承(基本上)是这样工作的。当您创建 D
时,D
负责分配所有 virtual
ly 继承的对象的位置。这些偏移量将不同于您创建动态类型为 B
或 C
.
没有办法做你想做的事。并非没有实际创建对象的实例。虽然 C++20 确实允许您在编译时创建虚拟类型的实例(只要它们具有可行的 constexpr
构造函数,所以您不能对所有事情都这样做),您仍然不能做您想要的需要。如果您有指向两种不同类型的指针,要计算它们之间的字节偏移量,您必须 reinterpret_cast
将这些指针转换为整数或 unsigned char*
。 reinterpret_cast
在编译时被禁止(当给定指针类型或包含指针的类型时,bit_cast
不是 constexpr
)。