【问题标题】:How to access virtual functions using vtable?如何使用 vtable 访问虚函数?
【发布时间】:2018-03-06 03:36:19
【问题描述】:

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

【问题讨论】:

  • 你为什么要这样做?你想解决什么问题?
  • @einpoklum 尝试使用 vtable 调用“bar”
  • std 中没有任何东西要求 vtable/vptr 但每个实现都使用这些。 OTOH,vtable 布局取决于实现,以及 vptr 在对象中的放置(通常在开头)
  • "试图使用 vtable 调用 'bar'" 但是为什么呢?好像 C++ 不够成熟。

标签: c++11 virtual-functions


【解决方案1】:

您尝试做的是不受支持/未定义,或者如果它已定义 - 非常不谨慎。如果AB 的基类,并且您认为您的A* ptr 实际上是B*,则只需使用dynamic_cast&lt;B*&gt;(ptr) 并像文明人一样访问B 方法...(但检查结果nullptr 的演员表,以防它毕竟不是 B*。)

【讨论】:

  • @curiousguy:没错。已编辑。
猜你喜欢
  • 1970-01-01
  • 2021-01-10
  • 2012-04-21
  • 1970-01-01
  • 2011-11-29
  • 1970-01-01
  • 2019-06-19
  • 2017-05-31
  • 2015-10-24
相关资源
最近更新 更多