其实指针类型只是设定了这个指针可以取值的范围
比如int型的,表示4个字节,long为8个
如果把long型强制转换为int,那么就会被截掉4个字节子类和父类也是一样
一般来说,用一个父类的指针来指向一个子类的对象,是没有问题的(最多是截掉一些数据)
如果用一个子类的指针来指向一个父类的对象,就会出现越界的问题
很可能会出现编译错误或运行错误
比如int型的,表示4个字节,long为8个
如果把long型强制转换为int,那么就会被截掉4个字节子类和父类也是一样
一般来说,用一个父类的指针来指向一个子类的对象,是没有问题的(最多是截掉一些数据)
如果用一个子类的指针来指向一个父类的对象,就会出现越界的问题
很可能会出现编译错误或运行错误
菜鸟在问你个问题:
在CExTraceView::OnDraw(CDC* pDC)
{
CExTraceDoc* pDoc=GetDocument();
}
GetDocument()返回的是CDocument类对象指针,这是不是也是一种“一个子类的指针来指向一个父类的对象”,那它会有危险吗?
你说的对,我屏蔽掉 pDClass->set_j (6);就可以成功释放掉指针了。可是为什么用debug跟踪到pDClass->set_j (6);后,不会出错,它还把后四个内存单元置成6,一直到delete才报错。是为什么呀?
{
CBaseClass* pBClass=new CBaseClass; // pBClass 是一个指针,pDClass也是,只不过你为他们分配了空间而已
CDerivedClass* pDClass=new CDerivedClass;
pDClass=(CDerivedClass*)pBClass; 现在你将pDClass强制转换为派生类,派生类需要比基类多余的空间在那?————所以这一句有问题,并且pDClass原来分配的空间现在已经丢失了【pDClass已经指向别处了】
pDClass->set_i (5);
pDClass->set_j (6); 所以这一句也会错,不是函数错,而是派生类的j没空间
delete pBClass;//为什么出错
}
至于这一句,如果你前面都没错的话,这一句也就没问题了
解释他为什么错,就需要仔细看看候老先生的《深入浅出MFC》了——类在内存中的分配
我明白了,请帮忙看看这个问题:
在CExTraceView::OnDraw(CDC* pDC)
{
CExTraceDoc* pDoc=GetDocument();
}GetDocument()返回的是CDocument类对象指针,这是不是也是一种“一个子类的指针来指向一个父类的对象”?
为什么不写成CExTraceDoc* pDoc=(CExTraceDoc*)GetDocument();
那它会有危险吗?
我说过它错了吗?我是说是它引起的错,如果觉得还要看《深入...》的话,不如看Lippman的《Inside the C++ Object Model》。
一般情况是没有危险,因为你的视图类与文档类是靠文档模板来创建的,也就是它肯定是一个子类实例的针,如果引用CDocument也就是父类的东西,本来就没有问题,如果想用子类的东西,要一个显式的转换就行了,不过编译器会提醒你的。
int x;
void *vp = &x;
float *pf = (float*)vp;
cout<<*pf;指针的强制转换就是将内存断看作是什么样的结构而已,你看着一段代码,VC会给你错误提示吗?NONE!
struct AA
{
int x;
public:
int get(){return x;}
};
void *p=NULL;
AA *pV = (AA*)pV;
注意——指针只有4个字节,它能干吗?所以别指望指针自己给你做多少,自己维护吧
AA *pV = (AA*)pV;
改为
char x=0;
void *p=&x;
AA *pV = (AA*)p;