Where are member functions stored for an object?

前端 未结 2 884
Happy的楠姐
Happy的楠姐 2020-11-30 06:03

I\'m experimenting with C++ to understand how class/structures and their respective objects are laid out in memory and I understood that each field of a class/structure is a

2条回答
  •  遥遥无期
    2020-11-30 06:57

    Member function pointers are in practice not stored in objects: there's no need. The C++ standard doesn't specify exactly how e.g. virtual functions are to be implemented, but the common practice for virtual member functions is that each object contains a pointer to a table of function pointers; this pointer is called a vtable pointer.

    You might try to get hold of “Inside the C++ object model” by Stanley Lippman.

    Or, you might just try to get hold of my old pointers tutorial, which was once referenced from Wikipedia's pointers article, before my then homepage site disappeared.


    Regarding the second question, why taking the address of p->memberFunc makes the compiler choke a little, well that expression has no type, it's just a syntactical entity, which you can apply an argument list to in order to call the function.

    To wit,

    struct S
    {
        void foo() {}
    };
    
    #include 
    #include 
    using namespace std;
    int main()
    {
        S* p = 0;
        typeid( &p->foo );
    } 
    

    Compilation:

    [W:\dev\test]
    > g++ foo.cpp
    foo.cpp: In function 'int main()':
    foo.cpp:12:17: error: ISO C++ forbids taking the address of a bound member function to form a pointer to member function.  Say '&S::foo' [-fpermissive]
    foo.cpp:12:22: warning: value computed is not used [-Wunused-value]
    foo.cpp:12:22: warning: statement has no effect [-Wunused-value]
    
    [W:\dev\test]
    > _
    

提交回复
热议问题