В коде, указанном в вопросе написана белиберда
В конструкторе предлагаешь сделать присваивание
vProtect = Protect;
глобальной переменной vProtect имя класса Protect (потому что у тебя Protect и класс и переменная типа cProtect, (то что компилятор тебе это позволил уже бардак), если переименовать cProtect мембер Protect в protect (как рекомендует большинство code styling - имена классов с большой буквы, имена переменных - с маленькой, чтобы не запутаться), а еще тип vProtect у тебя - указатель, а Protect - нет, если будут оба указатели то само собой все будет собираться, но все равно
смысла это иметь не будет.
-----------------------
Теперь про твой вопрос в заголовке, почти ничего не имеющий общего с текстом вопроса:
Как скрыть адрес вызываемой функции в C++?
в контексте обфускации, подразумевается что по декомпилированному исходному коду должно быть не ясно, какой именно метод будет вызываться (т.е. для анализа требуется отладка, что сложнее/дороже), значит хранить адреса методов нужно в каких то переменных, например массивах, а выбор следующего вызываемого метода делать на основе каких то вычислений по коду.
В c++ для этого реализован класс std::function, пример использования для вызова именно метода класса (для простоты пример без аргументов но с аргументами все то же самое, надеюсь ты понимаешь, что у тебя должны быть одинаковые аргументы и типы во всех методах, или должны быть группы для разных типов, но чем больше групп тем проще анализ кода, иначе тупо по типам и количеству аргументов все можно будет понять)
// определяем класс
class MyClass
{
public:
void myFunA(){std::cout<<"A";};
void myFunB(){std::cout<<"B";};
};
однократно где то инициализируешь массив адресов функций (никто не мешает по коду это перемешивать)
std::function<void(MyClass*)> functions[]={&MyClass::myFunA,&MyClass::myFunB};
вызов метода по номеру x
MyClass obj;
functions[x](&obj);