如何根据派生类的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->g()
是如何正确解析为B2::g()
的呢?
【问题讨论】:
它还能解决什么问题?除了B2::g()
,您希望它other 是什么?尽管语言标准没有定义实际调用的机制,但解决方案肯定是。无论如何,将其编译为 asm,您可能会发现 this->g()
只不过是 this
的简单推送(显然具有寄存器优化潜力)和 B::g()
的直接调用。毕竟,g()
不是虚拟的。
指针值会误导您。向三个结构中的每一个添加一个数据成员,然后重试。
【参考方案1】:
这里没有虚函数。所以你从B1::f
调用g
成员函数你调用定义 B1::g
。如果g
是虚拟的,情况确实会有所不同,因为所有f
函数都会调用C::g
(只需尝试在所有3 个结构中将void g()
替换为virtual void g()
)
【讨论】:
以上是关于如何根据派生类的this指针找到成员函数?的主要内容,如果未能解决你的问题,请参考以下文章