将基类指针强制转换成派生类指针有什么问题

kingstarer kingstarer 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
以前看过好几篇文章都说不允许将基类指针强制转换成派生类指针
因为当时没这个需求,所以就只记住了原则,没记住原理

但是现在自己碰上了这个需求:
从网上下载了一个解析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;
}


========================
不知道我上面的理由有什么漏洞? 或者是不允许转成派生类的原则并不是指的这种情况?
...全文

相关推荐

评论 18
收藏 已收藏
分享
返回顶部
kingstarer
C++ 语言 65,214 成员 250,514 内容