首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

关于基类指针赋值给子类的类型转换有关问题

2013-04-21 
关于基类指针赋值给子类的类型转换问题#includeiostreamusing namespace stdclass Base{public:int av

关于基类指针赋值给子类的类型转换问题

#include<iostream>
using namespace std;
class Base
{
public:
int a;
void Display(){cout<<"Base"<<endl;}
};
class Derive:public Base
{
public:
int b;
int c;
void Display(){cout<<"Derive"<<endl;}
};
int main()
{
 Base *pA=new Base;
 Derive *pB=new Derive;
 cout<<sizeof(pA)<<endl;
 cout<<sizeof(pB)<<endl;

 Base BaseClsObject,*pBase;
 pBase=&BaseClsObject;
 Derive *pDer=(Derive*)pBase;
 pDer->Display();
 
 system("PAUSE");
 return 0;
}
1、如何看待指针?(我的理解:它是一种数据类型,其实也是数据的一种;)
    20,21句打印出来的字节个数是相同的(都是4个字节),那么它们可以相互赋值(pA=pB或pB=pA)然后再去访问成员? 
 2、25句为何需要将基类指针强制转换为子类指针,但是这样不安全?而基类指针可以直接访问子类成员?
 3、指针类型之间的强制转化的实质是什么,具体是如何转换(细节)?
[解决办法]
1. 指针除了是 4 个字节的数据, 也就是一个内存的地址外, 它还有一个指向的类型, 也就是这个内存地址的内存中数据的类型.
2. 是不安全的, 你可以访问子类成员不报错, 是因为你的成员函数里没有使用类的成员变量, 也就是没有使用 this 指针.
3. 如果没有多继承, 转换什么也不会发生, 指针的值还是一样的, 还是指向同一个内存地址. 只是内存里面数据的解释方式变了.
[解决办法]
1. 内存中的数据没有变. 只是按不同的方式来解释了. 真因为这样, 所以这样转换才会危险. 一个指向 1.0f 的 float 指针被转换成 int 指针后, 它的值不会像 float 转换成 int 那样变成 1 的.
2. 是的. this 指针就是对象的指针. 你的 Display 函数没有使用成员函数, 就没有使用 this 指针, 也就没有使用 pDer 指针, 所以尽管这个指针是错的, 但是你不使用它就不会报错.
3. 强制转换就是拷贝指针的 4 个字节地址. 没什么细节.

#include <iostream>

using namespace std;

class Base
{
public:
int a;
void Display(){cout<<"Base"<<endl;}
};

class Derive:public Base
{
public:
int b;
int c;
void Display(){cout<<"Derive"<<endl;}
};

int main()
{
Base BaseClsObject;
Derive *pDer=(Derive*)&BaseClsObject;

printf("%p  %p", &BaseClsObject, pDer);
}


你可以看到, 打印出来的结果是一样的.

但是对多继承, 正常转换指针的话, 是会存在偏移的:


#include <iostream>

using namespace std;

class Base
{
public:
int a;
void Display(){cout<<"Base"<<endl;}
};

class Base2
{
public:
int d;
};

class Derive:public Base, public Base2
{
public:
int b;
int c;
void Display(){cout<<"Derive"<<endl;}
};

int main()
{
Derive d;
Base* pB = &d;
Base2* pB2 = &d;

printf("d = %p   pB = %p  pB2 = %p", &d, pB, pB2);
}


你可以看到, pB2 的指针往后移动了 4 个字节, 这个是 sizeof(Base) 的大小.
[解决办法]
因为 Derive 的内存布局可能是:

Base         int a;
Base2        int d;
自己的成员   int b;


             int c;

你说, 一个 Base2 的指针是不是该指向 int d; 的那个位置?  

热点排行