所以我试图使用vtable访问虚函数值。我理解的方式是编译器创建一个指向vtable的指针,并为包含虚函数的每个类创建一个vtable。我能够获得前两个成员的值。现在我不明白如何获得' bar'功能。
#include <cstdio>
#include <iostream>
class Thing
{
private:
int x;
int y;
virtual int foo()
{
return x+y;
}
virtual int bar()
{
return x*y;
}
public:
Thing(){
x = 2;
y = 10;
}
};
int extract_x(void *thing)
{
// --- Begin your code ---
char* ptrA = (char*)thing;
ptrA=ptrA+8;
return *ptrA;
return 0;
// --- End your code ---
}
int call_bar(void* thing)
{
// --- Begin your code ---
// --- End your code ---
return 0;
}
int main()
{
Thing thing;
std::printf("%d %d\n",
extract_x(&thing),
call_bar(&thing));
return 0;
}
答案 0 :(得分:2)
你要做的是不支持/未定义,或者如果它被定义 - 非常不谨慎。如果A
是B
的基类,并且您认为A* ptr
实际上是B*
,那么只需使用dynamic_cast<B*>(ptr)
并像文明一样访问B方法人类......(但是如果不是nullptr
,请检查演员的结果B*
。)