如何使用vtable访问虚拟功能?

时间:2018-03-06 03:36:20

标签: c++11 virtual-functions

所以我试图使用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;
}

1 个答案:

答案 0 :(得分:2)

你要做的是不支持/未定义,或者如果它被定义 - 非常不谨慎。如果AB的基类,并且您认为A* ptr实际上是B*,那么只需使用dynamic_cast<B*>(ptr)并像文明一样访问B方法人类......(但是如果不是nullptr,请检查演员的结果B*。)