有如下代码:
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函数添加上参数列表再进行调用测试
网友评论