【发布时间】:2019-09-11 03:17:20
【问题描述】:
示例:
class A {
public:
virtual void print() { std::cout << "A::print" << std::endl; }
}
我所知道的: 我们可以使用指向成员函数的指针和一个对象来调用成员函数,这样就可以了
typedef void (A::*fptr)(); //pointer-to-member-function
fptr p = &A::print;
A a;
(a.*p)(); // prints "A::print"
但似乎我可以使用没有对象的函数指针调用 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”指针来调用虚函数吗?
【问题讨论】:
-
代码通过不相关类型的指针访问对象来调用未定义的行为。任何事情都有可能发生。
-
很多东西都可以通过(缺乏)运气来“工作”。
标签: c++ class pointers virtual-functions