【发布时间】:2021-10-01 04:39:54
【问题描述】:
这让我很困惑,因为如果“this”指向它自己的对象,那么如何转换它(没有继承)允许我访问其他类成员?考虑到它的地址没有改变,我认为我对编译器的确切转换“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实际上是指向T的指针”。编译器有义务为您服务。但假装并不能使它成为现实。无论发生什么,纯属意外。形式上,这个程序的行为是未定义的; C++ 标准并没有告诉你程序做了什么。如果B更复杂,例如有fn使用的数据成员,问题就会变得更清晰。
标签: c++ class casting reinterpret-cast