I have recently encountered a behavior in C++ regarding function pointers, that I can't fully understand. I asked Google for help as well as some of my more experienced colleagues, but even they couldn't help.
The following code showcases this mystique behavior:
class MyClass{
private:
int i;
public:
MyClass(): i(0) {}
MyClass(int i): i(i) {}
void PrintText() const { std::cout << "some text " << std::endl;}
};
typedef void (*MyFunction) (void*);
void func(MyClass& mc){
mc.PrintText();
}
int main(){
void* v_mc = new MyClass;
MyFunction f = (MyFunction) func; //It works!
f(v_mc); //It works correctly!!!
return 0;
}
So, first I define a simple class that will be used later (especially, it's member method PrintText
). Then, I define name object void (*) (void*)
as MyFunction
- a pointer to function that has one void*
parameter and doesn't return a value.
After that, I define function func()
that accepts a reference to MyClass
object and calls its method PrintText
.
And finally, magic happens in main function. I dynamically allocate memory for new MyClass
object casting the returned pointer to void*
. Then, I cast pointer to func()
function to MyFunction
pointer - I didn't expect this to compile at all but it does.
And finally, I call this new object with a void*
argument even though underlying function (func()
) accepts reference to MyClass
object. And everything works correctly!
I tried compiling this code with both Visual Studio 2010 (Windows) and XCode 5 (OSX) and it works in the same manner - no warnings are reported whatsoever. I imagine the reason why this works is that C++ references are actually implemented as pointers behind the scenes but this is not an explanation.
I hope someone can explain this behavior.