这让我很困惑,因为如果" This "指向自己的对象,如果没有继承,如何将其强制转换())允许我访问其他类成员吗?我想我只是对"这"到底是什么感到困惑。考虑到它的地址不会改变,为编译器所做的。
template<class T>
class A
{
public:
void call_fn()
{
reinterpret_cast<T*>(this)->fn();
}
};
class B
{
public:
void fn()
{
std::cout << "B function called" << std::endl;
}
};
int main()
{
A<B> obj;
obj.call_fn(); //prints out "B function called"
}
一个非静态方法调用就像一个普通的函数调用,但有一个隐藏的this
参数指向对象。所示代码大致相当于以下代码:
class A {};
class B {};
void B_fn(B* this);
void A_call_fn(A* this) {
B_fn(reinterpret_cast<B*>(this));
};
void B_fn(B* this) {
std::cout << "B function called" << std::endl;
}
int main() {
A obj;
A_call_fn(&obj);
}
A::call_fn()
将其A* this
参数类型转换为B*
,然后用该类型转换的指针作为B* this
参数值调用B::fn()
。reinterpret_cast
实际上是一个暴力强制转换,它真的是在努力满足你的要求。所以你告诉编译器你知道你在做什么并接受它。确实如此。但是你正在调用未定义行为,因为就像你说的,A
和B
是不相关的类型。
代码发生工作,但只是因为B::fn()
没有使用它的B* this
参数,所以this
是否实际上指向一个有效的B
对象并不重要。如果您这样做,代码最终没有什么不同:
int main() {
std::cout << "B function called" << std::endl;
}
但是,如果您要更改B
以保存B::fn()
实际使用的非静态数据成员,那么代码将更明显地失败。