Приведение указателей на функции-члены и вызов
От: niralex  
Дата: 02.12.19 07:27
Оценка:
Доброго! Можно ли привести указатель на функцию-член класса к другому независимому классу и потом вызвать функцию?
Например, код ниже работает, но является ли он безопасным/переносимым, если предполагать что класс 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;
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.