Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/156.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么;这";使用指向函数的指针调用虚拟函数时不需要指针?_C++_Class_Pointers_Virtual Functions - Fatal编程技术网

C++ 为什么;这";使用指向函数的指针调用虚拟函数时不需要指针?

C++ 为什么;这";使用指向函数的指针调用虚拟函数时不需要指针?,c++,class,pointers,virtual-functions,C++,Class,Pointers,Virtual Functions,例如: class A { public: virtual void print() { std::cout << "A::print" << std::endl; } } 但我似乎可以使用指向函数的指针调用A::print,而无需对象: typedef void (*fptr)(); long *vptr; // pointer to virtual table fptr func; // pointer-to-function vptr = (long*

例如:

class A {
public:
    virtual void print() { std::cout << "A::print" << std::endl; }
}
但我似乎可以使用指向函数的指针调用A::print,而无需对象:

typedef void (*fptr)();
long *vptr; // pointer to virtual table
fptr func;  // pointer-to-function

vptr = (long*)(&a);
func = (fptr)( *(long*)(*vptr) ) // pointer to first function in virtual table
func(); // prints "A::print"

我的问题是为什么这样做?调用虚拟函数不需要“this”指针吗?

在这种情况下,它可以工作,因为打印函数不访问任何类成员变量,这意味着函数在执行时不需要使用“this”,这就是它工作的原因

如果所讨论的方法依赖于任何成员变量,那么它将非常失败

如果考虑以下方法的ASM:

void func1(){return;}
结构Foo{
void func2(){return;}
};
在这两种情况下,它们都可以归结为:

  ret
在此处添加打印语句:

void func1(){printf(“hello world”);}
结构Foo{
void func2(){printf(“hello world”);}
};
这两个的asm现在看起来都像:

  call printf
  ret

因此,虽然您在第二种情况下使用了错误的调用约定来调用该方法,但在这种情况下这并不是什么大问题(因为从未使用过)

代码通过不相关类型的指针访问对象来调用未定义的行为。任何事情都有可能发生。很多东西都可能因为(缺乏)运气而“起作用”。你错过了问题中的重要词语:虚拟功能。假设使用了
这个
。@s.M.你是什么意思?@curiuosguy指向虚拟表的指针放在
*这个
附近,因此用于获取虚拟表。
  call printf
  ret