Почему нельзя привести метод класса к общему указателю? А если можно то как?

В C++, приведение метода класса к общему указателю невозможно. Это связано с тем, что методы класса связаны с конкретным объектом этого класса, и для их вызова требуется контекст объекта.

Общий указатель, такой как void*, не является типобезопасным, поскольку не содержит информацию о типе данных, на который он указывает. Когда мы приводим метод класса к общему указателю, мы теряем информацию о контексте объекта, и следовательно, не можем вызвать этот метод, так как необходимо передать объект, к которому этот метод принадлежит.

Однако, есть способ обойти это ограничение, используя указатель на функцию-член класса. Указатель на функцию-член класса – это указатель, который указывает на определенный метод класса. В отличие от общего указателя, указатель на функцию-член класса сохраняет информацию о типе класса и контексте объекта. Кроме того, он может быть передан в другие функции, которые могут вызывать этот метод.

Приведение метода класса к указателю на функцию-член осуществляется с использованием следующего синтаксиса:

using MemberFunctionPointer = void (ClassName::*)(args);   // Объявление типа указателя на метод класса
MemberFunctionPointer ptr = &ClassName::MethodName;        // Приведение метода класса к указателю на функцию-член класса

Затем, чтобы вызвать метод через указатель на функцию-член класса, необходимо иметь экземпляр класса, к которому принадлежит этот метод:

ClassName obj;
(obj.*ptr)(args);   // Вызов метода через указатель на функцию-член класса

Таким образом, хотя приведение метода класса к общему указателю невозможно в C++, можно использовать указатель на функцию-член класса для обращения к методу класса.