将基类指针强制转换成派生类指针有什么问题
以前看过好几篇文章都说不允许将基类指针强制转换成派生类指针
因为当时没这个需求,所以就只记住了原则,没记住原理
但是现在自己碰上了这个需求:
从网上下载了一个解析xml的类库,里面提供的成员函数用起来不方便
于是我写了一个新类继承自原类,在里面提供了几个新的成员函数
将一些常见的操作放到里面,这样写起程序来比较方便
只要把基类指针强制转成派生类就可以调用这些函数了
对于这个,我想了一下
首先,派生类只增加了成员函数,成员函数又不在对象里面
所以内存结构不变,强制转换后只是类型不同,this指针的值也没变。
其次,成员函数的调用,据我理解,其实跟普通函数调用相似
只是由编译器负责传this指针,而根据上面可知,this指针值没变,
指向的内存也没变,所以派生类的成员函数应该能正常调用的
示例代码:
========================
不知道我上面的理由有什么漏洞? 或者是不允许转成派生类的原则并不是指的这种情况?
因为当时没这个需求,所以就只记住了原则,没记住原理
但是现在自己碰上了这个需求:
从网上下载了一个解析xml的类库,里面提供的成员函数用起来不方便
于是我写了一个新类继承自原类,在里面提供了几个新的成员函数
将一些常见的操作放到里面,这样写起程序来比较方便
只要把基类指针强制转成派生类就可以调用这些函数了
对于这个,我想了一下
首先,派生类只增加了成员函数,成员函数又不在对象里面
所以内存结构不变,强制转换后只是类型不同,this指针的值也没变。
其次,成员函数的调用,据我理解,其实跟普通函数调用相似
只是由编译器负责传this指针,而根据上面可知,this指针值没变,
指向的内存也没变,所以派生类的成员函数应该能正常调用的
示例代码:
#include "stdafx.h"
class BaseClass
{
public:
int getPassed() { return m_passed; }
BaseClass (int passsed):m_passed(passsed) {}
protected:
int m_passed;
};
class ChildBaseClass: public BaseClass
{
public:
ChildBaseClass():BaseClass(0) {}
void setPassed(int passed) {m_passed = passed;}
};
int main(int argc, char *argv[])
{
ChildBaseClass child;
cout << child.getPassed() << endl;
child.setPassed(1);
cout << child.getPassed() << endl;
BaseClass base(0);
cout << base.getPassed() << endl;
ChildBaseClass *pchild = (ChildBaseClass *) &base;
pchild->setPassed(1);
cout << base.getPassed() << endl;
return 0;
}
========================
不知道我上面的理由有什么漏洞? 或者是不允许转成派生类的原则并不是指的这种情况?
...全文
相关推荐
C++强制类型转换
C++强制类型转换的资料,详细介绍了C++特有的四种类型转换机制,供有需要的人下载!
(转)一个优秀的C++学习笔记
这是由一个北大的学生自己编写的C++学习笔记,对不同层次的学习者都有很大的帮助
C++基类指针和派生类指针之间的转换方法讲解
今天小编就为大家分享一篇关于C++基类指针和派生类指针之间的转换方法讲解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
C++中基类和派生类之间的转换实例教程
主要介绍了C++中基类和派生类之间的转换,有助于深入理解C++面向对象程序设计,需要的朋友可以参考下
C++派生类与基类的转换规则
基类与派生类对象之间有赋值兼容关系,由于派生类中包含从基类继承的成员,具体表现在以下几个方面,需要的朋友可以参考下


