如何根据派生类的this指针找到成员函数?

Posted

技术标签:

【中文标题】如何根据派生类的this指针找到成员函数?【英文标题】:How is a member function found based on this pointer of the derived class? 【发布时间】:2017-07-08 15:05:40 【问题描述】:

考虑以下示例:

struct B1 
    void f() 
        this->g();
        std::cout << this << std::endl;
    
    void g() 
        std::cout << "B1::g" << std::endl;
    
;

struct B2 
    void f() 
        this->g();
        std::cout << this << std::endl;
    
    void g() 
        std::cout << "B2::g" << std::endl;
    
;

struct C: B1, B2 
    void f() 
        B1::f();
        B2::f();
        std::cout << this << std::endl;
    
    void g() 
        std::cout << "C::g" << std::endl;
    
;

int main() 
    C c;
    c.f();
    return 0;

对我来说,输出是:

B1::g
0x7fffa11436b7
B2::g
0x7fffa11436b7
0x7fffa11436b7

让我们关注B2::f。从输出中可以看出,在B2::f 内部,this 指向C 类型对象的开头。那么,this-&gt;g() 是如何正确解析为B2::g() 的呢?

【问题讨论】:

它还能解决什么问题?除了B2::g(),您希望它other 是什么?尽管语言标准没有定义实际调用的机制,但解决方案肯定是。无论如何,将其编译为 asm,您可能会发现 this-&gt;g() 只不过是 this 的简单推送(显然具有寄存器优化潜力)和 B::g() 的直接调用。毕竟,g() 不是虚拟的。 指针值会误导您。向三个结构中的每一个添加一个数据成员,然后重试。 【参考方案1】:

这里没有虚函数。所以你从B1::f 调用g 成员函数你调用定义 B1::g。如果g 是虚拟的,情况确实会有所不同,因为所有f 函数都会调用C::g(只需尝试在所有3 个结构中将void g() 替换为virtual void g()

【讨论】:

以上是关于如何根据派生类的this指针找到成员函数?的主要内容,如果未能解决你的问题,请参考以下文章

在 C++ 中将指向基类的指针传递给派生类的成员函数

为啥指向基类的派生类指针可以调用派生类成员函数? [复制]

基类与派生类的指针和成员函数调用原理

this指针的作用

c++类的成员函数指针如何转为普通指针

6多态性-3虚函数