如何将这个指针转换为一个不相关的类工作?



这让我很困惑,因为如果" 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实际上是一个暴力强制转换,它真的是在努力满足你的要求。所以你告诉编译器你知道你在做什么并接受它。确实如此。但是你正在调用未定义行为,因为就像你说的,AB是不相关的类型。

代码发生工作,但只是因为B::fn()没有使用它的B* this参数,所以this是否实际上指向一个有效的B对象并不重要。如果您这样做,代码最终没有什么不同:

int main() {
    std::cout << "B function called" << std::endl;
} 

但是,如果您要更改B以保存B::fn()实际使用的非静态数据成员,那么代码将更明显地失败。

相关内容

最新更新