我有两个类(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/