C++类指针转换

各种类型转换,有必要扩展开了解一下

Posted by 雯饰太一 on May 28, 2023

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++中的类型转换有很多种,静态、动态的转型用在不同的位置,使用的场景也有差别,有的会在编译期间报错,虽然能通过试错写出来能用的代码,但是对于底层知识的掌握却还远远不够。