多态时,使用reinterpret_cast进行类型转换。
#include#include #include 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(&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。



