C++基础之基类派生类指针间强转问题(基类派生类傻傻分不清)
2014-09-20 15:55
513 查看
先简单介绍一下前提情况,有继承关系,才称为基类派生类
类B继承类A,A是基类,B是派生类
A类指针可以找到A类中的成员,B类指针可以找到B类中的成员,但是B类继承A类,B类中先有A类的成员,其次是自己的成员(前提A类没有涉及到虚)
通过解析代码来发现问题:
编译器没有报错,内存上确实修改了
基类指针强转为派生类指向派生类成员,不会报错,但不合法,修改了他人的内存
派生类指针强转为基类指针完全可以,不为错
结果为new出的八个字节的空间,前四个字节为1,后四个字节为3,分析:
new出A对象八个字节的空间,调函数,前四个字节为1,重点来了,将基类的指针强转为派生来,导致在基类的空间中寻找派生类的东西,才会修改其他人内存,派生类中继承A类成员变量和拥有自己的成员变量,前面为基类的,后面为自己的,强转后,看父类成员变量是4个字节,好,那我现在八个字节的空间中抛出前面四个字节当做是基类的,然后后面就当做是派生类的,赋值!(基类指针调自己的函数,但是强转以后函数同名不知道调哪个,就根据指针类型来调,派生类的指针……)
基类指针强转为派生类指针本不合法,但人为需要也不可避免
解决方法:1.派生类没有自己的成员变量
2.派生类里的函数不是给派生类的成员变量赋值
3.将父类函数写成虚函数
类B继承类A,A是基类,B是派生类
A类指针可以找到A类中的成员,B类指针可以找到B类中的成员,但是B类继承A类,B类中先有A类的成员,其次是自己的成员(前提A类没有涉及到虚)
通过解析代码来发现问题:
class A { public: int a; }; class B : public A { public : int b; };//B继承A,各有一个简单变量 问题1:基类指针强转为派生类会出什么问题 A *pa = new A; pa->a = 2; ( ( B* ) pa)->b = 3;//A类中没有成员b,强转A类指针找b赋值-----会发生什么情况
编译器没有报错,内存上确实修改了
基类指针强转为派生类指向派生类成员,不会报错,但不合法,修改了他人的内存
问题2:派生类指针强转为基类指针会出什么问题 B *pb = new B; ( ( A* ) pb)->a = 2;//派生类指针强转为父类指针 ( ( A* ) pb + 1)->a = 3;//我想给b赋值,但是( (A*) pb)->b这样来寻找b在编译时候不通过
派生类指针强转为基类指针完全可以,不为错
问题3:结果是什么 class A { public: int a; void aa(){a = 1}; }; class B : public A { public: int b; void aa(){b = 3};//同名函数 }; A *p = new A[2]; p->aa(); ( (B*) p)->aa();//强转
结果为new出的八个字节的空间,前四个字节为1,后四个字节为3,分析:
new出A对象八个字节的空间,调函数,前四个字节为1,重点来了,将基类的指针强转为派生来,导致在基类的空间中寻找派生类的东西,才会修改其他人内存,派生类中继承A类成员变量和拥有自己的成员变量,前面为基类的,后面为自己的,强转后,看父类成员变量是4个字节,好,那我现在八个字节的空间中抛出前面四个字节当做是基类的,然后后面就当做是派生类的,赋值!(基类指针调自己的函数,但是强转以后函数同名不知道调哪个,就根据指针类型来调,派生类的指针……)
基类指针强转为派生类指针本不合法,但人为需要也不可避免
解决方法:1.派生类没有自己的成员变量
2.派生类里的函数不是给派生类的成员变量赋值
3.将父类函数写成虚函数
看Cocosd源码中,hellocworld里init写成虚函数的原因,哪一天自己成了父类,自己不会掉到子类的函数将自己自己修改了
相关文章推荐
- C++继承中基类和派生类之间指针传递问题
- C++的继承操作---基类指针访问派生类问题---基类成员恢复访问属性问题
- C++ 派生类指针指向基类对象
- 关于C++基类、派生类的引用和指针(动态绑定和静态绑定)
- C++中指向派生类的基类指针、基类引用的一点总结
- 关于基类指针、派生类指针、基类对象派、生类对象问题
- 关于通过不含虚析构函数的基类类型的指针删除派生类对象的问题
- C++ 基类与派生类之间的相互引用、赋值问题
- C++ 派生类指针强制指向基类对象
- C++ 派生类指针强制指向基类对象
- C++让基类握住派生类的指针
- 基类(base class)和派生类(derived class)指针在C++的相互转化
- 【C++】基类指针可以指向派生类对象,派生类指针不可以指向基类对象
- C++基础之详解this指针(有,或者没有,这不是个问题)
- C++ 基类、派生类对象指针的声明与使用
- c++中基类与派生类中隐含的this指针的分析
- 关于c++在内存布局意义下使用派生类指针访问基类
- [疑问]C/C++中为什么在类外利用多态基类指向派生类指针可以调用类的私有成员函数?
- C/C++中为什么在类外利用多态基类指向派生类指针可以调用类的私有成员函数?
- c++基类与继承类指针转换问题