您的位置:首页 > 编程语言 > C语言/C++

C++基础之基类派生类指针间强转问题(基类派生类傻傻分不清)

2014-09-20 15:55 513 查看
先简单介绍一下前提情况,有继承关系,才称为基类派生类

类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写成虚函数的原因,哪一天自己成了父类,自己不会掉到子类的函数将自己自己修改了
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: