参数类型为父类指针,我给子类指针,运行出错,怎么回事?

brk1985 2009-06-16 03:15:38
#include <stdlib.h>
//#include <windows.h>
#include <list>
#include <iostream>
#include <afxcoll.h>

using namespace std;

class CAge: public CObject
{
public:
int age;
CAge(int param){
age = param;
}
virtual ~CAge(){

}

};

void main(){
CObList* list = NULL;
POSITION pos;
CAge* age_20 = new CAge( 20 );
CAge* age_40 = new CAge( 40 );
CAge* age_60 = new CAge( 60 );
CAge* age_80 = new CAge( 80 );
list->AddHead( age_20 ); //VS2005运行出错,"Debug Assertion Failed!"
list->AddHead( age_40 );
list->AddHead( age_60 );
list->AddHead( age_80 );
while( ( pos = list->GetHeadPosition() ) != NULL )
{
cout<< pos << endl;
list->RemoveHead();

}
Sleep(10000);
delete list;

}


执行语句list->AddHead( age_20 );,出现问题
...全文
134 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
brk1985 2009-06-16
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 adventurelw 的回复:]
父类指针可以指向子类对象,但父类指针不是子类指针,之间不能隐式转换。
需要用dynamic_cast进行安全转换。或者直接强制转换也应该可以
[/Quote]

这种情况下不需要强制转换的吧?反过来才需要的吧。
goodname 2009-06-16
  • 打赏
  • 举报
回复
不知道你还想干什么,讨论的已经很清楚了吧。
brk1985 2009-06-16
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 jiao22220509 的回复:]
你的CObList* list = NULL;
是父类,,然后给里面插入了子类的信息,是不可以的,因为子类不但继承了父类的所有内容,还加入了自己的内容,也就是存储空间不一致造成的

你这里只能用子类的list来保存父类。。。

遵循一个规则:大的空间才能保存小的数据,,没有说小的能保存大的
[/Quote]

哈哈,发现了,不是这个问题。

AddHead的函数:POSITION AddHead(CObject* newElement);
我所问的是 这函数的参数指针是父类的,不是指CObList*是父类指针。链表list添加父类指针,内容少点;添加子类指针,内容丰富点。
goodname 2009-06-16
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 brk1985 的回复:]
“你的CObList* list = NULL;是父类,,然后给里面插入了子类的信息,是不可以的,因为子类不但继承了父类的所有内容,还加入了自己的内容,也就是存储空间不一致造成的”,1楼讲的没错呀!
但是我加了“new CObList();”之后,问题解决了。竟然没有出错???
[/Quote]

CObList存储的是指针,使可以的。如果存储对象,则不行。
adventurelw 2009-06-16
  • 打赏
  • 举报
回复
父类指针可以指向子类对象,但父类指针不是子类指针,之间不能隐式转换。
需要用dynamic_cast进行安全转换。或者直接强制转换也应该可以
brk1985 2009-06-16
  • 打赏
  • 举报
回复
“你的CObList* list = NULL;是父类,,然后给里面插入了子类的信息,是不可以的,因为子类不但继承了父类的所有内容,还加入了自己的内容,也就是存储空间不一致造成的”,1楼讲的没错呀!
但是我加了“new CObList();”之后,问题解决了。竟然没有出错???
Treazy 2009-06-16
  • 打赏
  • 举报
回复
[Quote=引用楼主 brk1985 的帖子:]
执行语句list->AddHead( age_20 );,出现问题
[/Quote]
list指向的内存都没分配合法空间
你至少不能让list指向NULL吧?


CObList* list = NULL;
//改成
CObList* list = new CObList();

goodname 2009-06-16
  • 打赏
  • 举报
回复
看起来应该是

CObList* list = NULL;


list = new CObList;

...
list->AddHead( age_20 ); //VS2005运行出错,"Debug Assertion Failed!"
list->AddHead( age_40 );
list->AddHead( age_60 );
list->AddHead( age_80 );
jiao22220509 2009-06-16
  • 打赏
  • 举报
回复
你的CObList* list = NULL;
是父类,,然后给里面插入了子类的信息,是不可以的,因为子类不但继承了父类的所有内容,还加入了自己的内容,也就是存储空间不一致造成的

你这里只能用子类的list来保存父类。。。

遵循一个规则:大的空间才能保存小的数据,,没有说小的能保存大的
随着通信电子技术的迅速发展,信息技术给家居行业产生了深远的影响,家居环境的智能化监控已经成为智能家居的一个重要的发展方向。人们逐渐对自己的生活提出一种更高的要求,他们需要一种智能化、可交互,并且融合现代创新科技的产品来改善他们的生活环境,使他们生活更加安全、舒适、便捷、智能。本文根据智能家居的发展背景和研究现状,并且从实用性和可行性角度出发,研究设计了一种基于STM32单片机的智能家居系统。该系统由一个多功能综合的技术系统组成,各个多功能子系统间具有协同配合能力。基于STM32单片机实现的功能子系统包括:智能温度检测,智能湿度检测,智能烟雾/火灾检测智能检测,无线传输,人机交互机构,风扇调节,报警模块。 整个系统分为前端51单片机采集板和后端STM32单片机接收板。 采集板使用DHT11温湿度传感器、MQ烟雾传感器完成室内家居环境的采集。然后通过nRFL24L01将采集到的数据发送给后端。接收板使用LCD1602完成数据显示、使用蜂鸣器模块报警,使用风扇驱动模块调节室内家居环境。本文完成了智能家居控制系统前端、后端软硬件的设计,使用Altium designer绘制了电路原理图,使用Keil C完成了51单片机和STM32单片机的编程与调试。 最后,对本文设计的基于STM32的智能家居控制系统进行部署调试。试验结果表明,该系统可成功应用在智能家居环境检测调节和火灾安全防护的领域,可提高家居生活智能化水平。

65,210

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧