C++ 如何查找c++;虚拟表?
下面是一个简单的示例代码:C++ 如何查找c++;虚拟表?,c++,vtable,C++,Vtable,下面是一个简单的示例代码: #include <iostream> class Base { public: virtual void func0() { std::cout << "Base::func0" << std::endl; }; virtual void func1() { std::cout << "Base::func1" << std::endl; }; };
#include <iostream>
class Base
{
public:
virtual void func0() { std::cout << "Base::func0" << std::endl; };
virtual void func1() { std::cout << "Base::func1" << std::endl; };
};
int main()
{
auto instance = Base();
uint64_t* vtableAddr = reinterpret_cast<uint64_t*>(&instance);
uint64_t* pVtable = reinterpret_cast<uint64_t*>(*vtableAddr);
auto func0 = reinterpret_cast<void(*)(Base*)>(*(pVtable + 0));
auto func1 = reinterpret_cast<void(*)(Base*)>(*(pVtable + 1));
func0(&instance);
func1(&instance);
auto func2 = reinterpret_cast<void(*)(Base*)>(*(pVtable + 2)); // exceed the limitation
func2(&instance); // core dump
}
#包括
阶级基础
{
公众:
virtual void func0(){std::cout不能保证vtable存在,而且只要处理更复杂的继承(多个/虚拟和多个/虚拟的组合)你会非常失望的。从@Stephen Newellvtable是一个可能的实现,但不是必需的实现……你所做的似乎是运行时意外/错误的秘诀。建议考虑使用成员函数指针这是一个学术练习还是你正试图解决的具体问题olve?一个有趣的练习:尝试计算该段代码中有多少未定义行为的实例。不能保证vtable存在,而且只要处理更复杂的继承(多重/虚拟和多重/虚拟的组合)你会非常失望的。编译器不需要在运行时知道vtable的限制,因为它在编译时拥有类的完整定义(包括vtable大小)。它不会生成超出这些限制的代码。但这不会阻止你做一些愚蠢的事。