C++类指针转换
有如下代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
class SimA{
public:
SimA(){m_iA = 0;}
~SimA(){}
void fun1(){ printf("simA:fun1\n");++m_iA;}
int GetA(){return m_iA;}
private:
int m_iA;
};
class SimB{
public:
SimB(){m_iA = 0;};
~SimB(){}
void fun2(){ printf("simB:fun2\n");}
void fun1(){ printf("simB:fun1\n");++m_iA;}
int m_iA;
};
//mian函数测试代码
SimA* sa = new SimA();
SimB* sb = (SimB*)sa;
sb->fun1();
printf("m_iA = %d\n",sa->GetA());
上述sb调用过程会进入自己函数的fun1中,最终sa的值将会发生修改,sa->GetA() == 1;上述代码语法正确,而且能够编译通过。
合理解释:
- C++的每个类的函数在内存中都只在编译期有一份,而对象可以有多个,对象里面只包含类的成员变量,对象的不同体现在这些成员变量的不同
- 当进行强制类型转换的时候,SimB类型的指针会将内存空间解释成自己需要的样子
- 因为SimB和SimA有同名函数,且第一个成员变量都是int类型,在调用SimB::fun1的时候刚好可以对变量进行修改。
可以多做一些测试:
- A类中多写几个成员变量,保证AB两类的变量顺序不同
- A类中变量名略微调整后测试效果
- B类中fun1函数添加上参数列表再进行调用测试
注:C++中的类型转换有很多种,静态、动态的转型用在不同的位置,使用的场景也有差别,有的会在编译期间报错,虽然能通过试错写出来能用的代码,但是对于底层知识的掌握却还远远不够。