C++ 如何在c+中实现虚拟表+;
虚表是函数指针的数组。C++ 如何在c+中实现虚拟表+;,c++,C++,虚表是函数指针的数组。 如何实现它,因为每个函数都有不同的签名?如果虚拟表中的函数有不同的签名,则必须将其实现为包含异构类型成员的结构类型 或者,如果有其他信息告诉您签名是什么,则可以将函数指针强制转换为另一个函数指针类型,只要在调用之前将其强制转换回正确的类型。如果虚拟表中的函数具有不同的签名,您必须将其实现为包含异构类型成员的结构类型 或者,如果您有其他信息告诉您签名是什么,您可以将函数指针强制转换为另一个函数指针类型,只要您在调用它之前将其强制转换回正确的类型。您没有实现它 编译器生成它(
如何实现它,因为每个函数都有不同的签名?如果虚拟表中的函数有不同的签名,则必须将其实现为包含异构类型成员的结构类型
或者,如果有其他信息告诉您签名是什么,则可以将函数指针强制转换为另一个函数指针类型,只要在调用之前将其强制转换回正确的类型。如果虚拟表中的函数具有不同的签名,您必须将其实现为包含异构类型成员的结构类型
或者,如果您有其他信息告诉您签名是什么,您可以将函数指针强制转换为另一个函数指针类型,只要您在调用它之前将其强制转换回正确的类型。您没有实现它 编译器生成它(或具有等效功能的东西),它不受类型系统的约束,因此它可以简单地存储函数地址并生成正确调用它们所需的任何代码 您可以使用包含不同类型的函数指针的
struct
而不是数组来实现类似的东西。这是在C中实现动态多态性的一种非常常见的方法;例如,Linux内核通过定义一个接口,为类似文件的对象提供多态性行为,接口包括:
struct fileops {
int (*fo_read) (struct file *fp, ...);
int (*fo_write) (struct file *fp, ...);
// and so on
};
你没有实现它 编译器生成它(或具有等效功能的东西),它不受类型系统的约束,因此它可以简单地存储函数地址并生成正确调用它们所需的任何代码 您可以使用包含不同类型的函数指针的
struct
而不是数组来实现类似的东西。这是在C中实现动态多态性的一种非常常见的方法;例如,Linux内核通过定义一个接口,为类似文件的对象提供多态性行为,接口包括:
struct fileops {
int (*fo_read) (struct file *fp, ...);
int (*fo_write) (struct file *fp, ...);
// and so on
};
如果您在编译时知道每个函数,那么您可以使用不同类型函数指针的结构(然而,如果您在编译时知道每个函数,为什么不使用带有虚拟方法的类?) 如果您想在运行时执行此操作,那么一个
void*
数组可能就足够了。在调用指针之前,您需要在存储指针时将其强制转换为输入,然后再将其转换为输出(正确的类型)。当然,您需要在其他地方跟踪函数类型(包括调用约定)
如果不知道你打算怎么做,很难给出一个更有用的答案
在代码中实现vtables有充分的理由。不过,它们是一个实现细节,因此您需要针对一个已知的ABI,而不仅仅是“C++”。我唯一一次这样做是在运行时动态创建新COM类的实验(COM对象的ABI是指向vtable的指针,该vtable包含遵循
\uu stdcall
调用约定的函数,其中前3个函数实现IUnknown
接口).如果您在编译时知道每个函数,那么您可以使用不同类型函数指针的结构(但是,如果您在编译时知道每个函数,为什么不使用带有虚拟方法的类?)
如果您想在运行时执行此操作,那么一个void*
数组可能就足够了。在调用指针之前,您需要在存储指针时将其强制转换为输入,然后再将其转换为输出(正确的类型)。当然,您需要在其他地方跟踪函数类型(包括调用约定)
如果不知道你打算怎么做,很难给出一个更有用的答案
在代码中实现vtables有充分的理由。不过,它们是一个实现细节,因此您需要针对一个已知的ABI,而不仅仅是“C++”。我唯一一次这样做是在运行时动态创建新COM类的实验(COM对象的ABI是指向vtable的指针,该vtable包含遵循
\uu stdcall
调用约定的函数,其中前3个函数实现IUnknown
接口).虚拟表是一个实现细节。它与类型系统无关。函数指针无效。是否创建自己的函数表?或者你想知道C++编译器是如何做的吗?VTABLE是函数指针的结构,是指向<代码> STD::Type OnngIs< /Cord>对象的指针。解决了悖论。虚拟表是一个实现细节。它与类型系统无关。函数指针无效。是否创建自己的函数表?或者你想知道C++编译器是如何做的吗?VTABLE是函数指针的结构,是指向<代码> STD::Type OnngIs< /Cord>对象的指针。悖论解决了。+1表示赞同问题的观点,并建议struct更适合……是否有理由否决?如果我的答案是错误的,那么我想纠正它。+1感谢你从问题的角度出发,并建议struct是一个更好的匹配项……有什么理由投反对票吗?如果我的答案是错的,那么我想改正它。