多态时,使用reinterpret_cast进行类型转换。
#include <iostream>
#include <string>
#include <memory>
?
using namespace std;
struct A
{
int a;
?
virtual ~A() = default;
?
void Print()
{
cout << a << endl;
}
};
?
struct B
{
int b;
?
virtual ~B() = default;
?
void Print()
{
cout << b << endl;
}
};
?
struct C : A, B
{
};
?
int main()
{
C c;
c.a = 1;
c.b = 2;
?
B* pb = reinterpret_cast<B*>(&c);
pb->Print();
return 0;
}
输出结果为:1
因为 C 的第一个基类是 A ,所以 static_cast(&c)的结果跟 &c 在指针的那个数字上是一样的,那么 reinterpret_cast(&c) 执行完之后, pb 实际上指向的是 C 对象里面 A 的部分。 类 A 和 B 的内容完全一致,所以这个类的长度是 2sizeof(void) ,第一个指针保存的是虚函数表,第二个指针保存的是成员变量 a 或者 b 的内容,然后由于成员对齐的关系,就补到了两个指针那么长。 因此当代码执行到 cout << this->b << endl的时候,按照 &B::b 的偏移去解释 this 指针,所以读到的就是 A::a 了。 这是流行的做法,C++ 并没有做出任何规定说必须这样实现。 reinterpret_cast在这种情况下,C++ 也没有要求编译器一定要这样做。所以不能总是依靠巧合编程。当你需要把子类的指针转成父类的指针的时候,一定要用 static_cast。
|