Это не имеет ничего общего с "C против C ++". Вам просто нужно понять, что влечет за собой вызов функции-члена и в основном то, к чему она сводится.
myObject.memberFunction(); // This is what the programmer sees.
memberFunction(&myObject); // This is what the compiler sees.
Функция-член - это необычное описание функции, которая просто принимает объект в качестве первого параметра. Он просто невидим в реальном списке параметров.
void MyClass::memberFunction() // This is the declaration the programmer sees.
void memberFunction(MyClass* this) // This is what the compiler sees.
С этого момента C ++ добавляет специальную семантику, чтобы упростить работу объектно-ориентированным способом. Таким образом, даже если ваш объект имеет функцию-член формата void (int, int), он на самом деле имеет формат void (Camera *, int, int) и не соответствует требуемому формату! Вот почему члены-статические функции могут использоваться для таких указателей функций . Вы когда-нибудь замечали, что статические функции-члены не могут получить доступ к членам "this"? Это связано с тем, что статические функции-члены не передают экземпляр объекта, представляющего this.
Фактически, вы можете эмулировать большую часть объектно-ориентированного программирования на простом языке C. Если вы сделаете набор функций, которые принимают указатель структуры в качестве первого параметра, вы получите много таких же преимуществ!