美文网首页
C++类指针转换

C++类指针转换

作者: 雯饰太一 | 来源:发表于2023-06-07 08:07 被阅读0次

    有如下代码:

    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++类指针转换

          本文链接:https://www.haomeiwen.com/subject/ojmredtx.html