让我开始声明我是一个对自制编程充满热情的人,所以请原谅不专业的语言,英语不太好我得到了翻译的支持。根据我的理解,似乎无法将指向对象及其函数成员之一的指针转换为虚拟结构。尤其不能这样调用成员函数:
#include <iostream>
struct _T{};
class Class1
{
public:
void print()
{ std::cout << "Class1::print ...." << std::endl; }
int sum(int value)
{ return m_dato+value; }
private:
int m_dato { 10 };
};
int main()
{
Class1 item;
void(_T::*func)();
int(_T::*fsum)(int);
Class1* p1=&item;
auto p2=reinterpret_cast<_T*>(p1);
func =reinterpret_cast<void(_T::*)()>(&Class1::print);
(p2->*func)();
fsum =reinterpret_cast<int(_T::*)(int)>(&Class1::sum);
auto dato=(p2->*fsum)(55);
std::cout << "Dato: " << dato << std::endl; // ok 65..
std::cout << "Fine procedura ...." << std::endl;
return 0;
}
现在除了猜测指向 Class1 的指针可能不包含在 _T 指针中之外,我不明白为什么这段代码在所有条件下都能正常工作(如果类是派生的并且函数是虚拟的,在这种情况下多重继承,在函数只存在于基类中的情况下,等等......)。最后,我没有告诉编译器调用类(Class1)的地址,编译器很清楚,并且该函数与类指针有一定的偏移,并且该函数的签名类似于一个在演员之后存储。