Доброго! Можно ли привести указатель на функцию-член класса к другому независимому классу и потом вызвать функцию?
Например, код ниже работает, но является ли он безопасным/переносимым, если предполагать что класс Concret может быть любым, включая различные виды наследования(множественное, виртуальное и т.д.)?
// С++17
#include <iostream>
using namespace std;
class Common; // без определения
class Concret // может быть наследование
{
public:
void Test(){std::cout << "ok" << endl; }
};
using ConcretMemberPointer = void (Concret::*) ();
using MemberPointer = void (Common::*) ();
int main()
{
Concret *ob = new Concret;
ConcretMemberPointer cmp = &Concret::Test;
(ob->*cmp)(); // ok
MemberPointer mp = reinterpret_cast<MemberPointer>(cmp);
Common *com = reinterpret_cast<Common*>(ob);
(com->*mp)(); // ok, но безопасно ли???
return 0;
}