c++ - C++中通过虚表访问函数

标签 c++ virtual-table

我有两个类(class) B 和 D

class B{
public:
  virtual int prva()=0;
  virtual int druga(int)=0;
};

class D: public B{
public:
  virtual int prva(){return 42;}
  virtual int druga(int x){return prva()+x;}
};

我的任务是创建一个函数,该函数接受指向对象 B 的指针,并打印方法“prva”和“druga”的返回值,而不使用它们的名称(通过虚拟表访问)

我编写了以下代码,成功打印了方法“prva”的返回值,但无法对第二种方法“druga”执行相同的操作

typedef int (*PTRFUN1)(void);
typedef int (*PTRFUN2)(int);

void function (B* var){
    int* vptr =  *(int**)var;
    PTRFUN1 fun1 = (PTRFUN1)vptr[0];
    PTRFUN2 fun2 = (PTRFUN2)vptr[1];
    pprintf("Prva:%d\n", fun1());
    printf("Druga:%d\n", fun2(2));
}

int main(void){
    B *pb = new D();
    function(pb);
}

此代码执行打印:“Prva:42”

无法调用 prva()在“毒品”内部,我不明白为什么。

此外,如果我只是删除 prva() 的调用让 body 成为return x ,方法“druga”将始终返回“42”或任何我让“prva”返回的数字,无论我尝试通过 fun2() 发送什么参数。

有什么想法我在这里做错了什么,我应该如何访问方法?

最佳答案

无法在标准 C++ 中访问虚拟表。事实上,该语言甚至没有虚拟表是什么的概念。虚拟表是实现动态调度的一种特定(且流行)的方式。

Any ides what am I doing wrong here

当您间接通过vptr时,程序的行为是未定义的。

某些实现可能有方法访问 C++ 中的表,但没有标准方法。如果你的编译器没有,那么唯一的方法就是研究编译器如何实现它,编写程序以汇编方式访问它。

关于c++ - C++中通过虚表访问函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61010745/

相关文章:

c++ - 单个文件上两个 C FILE* 流的一致性

sql-server - 表变量和虚拟表是一回事吗?

c - 在不使用函数指针的情况下替代在 C 中引用虚拟表。

c++ - 为什么使用存储在虚方法表中的地址调用虚函数会返回垃圾?

c++ - 具有虚拟指针和继承的cpp类大小

c++ - 虚拟表和 _vptr 存储方案

c++ - Visual Studio 2013 C++ 不编译更改

c++ - 错误 C2664 : 'callToPrint' : cannot convert parameter 1 from 'std::wstring' to 'LPTSTR'

c++ - 一个成员函数范围内的成员变量,但不在另一个成员函数范围内

c++ - 使用 C++ 计算一个非常大的幂