还是父类指针和子类对象的问题

lagest 2002-12-19 11:19:28
#include <iostream.h>
class a{
public:
virtual void print(){cout<<"Class A"<<endl;}
};

class b:public a{
public:
virtual void print(){cout<<"Class B"<<endl;}
};

class c:public a{
public:
virtual void print(){cout<<"Class C"<<endl;}
};
void main(){
a * pa;
a thea;
b theb;
c thec;

pa = &thea;
pa->print();
delete pa;

pa = &theb;//父类指针指向子类对象
pa->print();
delete pa;

pa = &thec;//父类指针指向子类对象
pa->print();
delete pa;
}

运行结果:Class A 然后就出错;请高手指教。
...全文
56 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
JoshuaLi 2002-12-27
  • 打赏
  • 举报
回复
没有用new不要用delete
peterlihui 2002-12-20
  • 打赏
  • 举报
回复
Borland C++ 编译器5.5对多次delete操作不会报错喔!
lagest 2002-12-19
  • 打赏
  • 举报
回复
唉 没学好 啊
偶知道stack和堆 但是不知道他们具体是怎么分配的 特别是堆 好象已经没什么概念了
rushman 2002-12-19
  • 打赏
  • 举报
回复
--a thea ;和 a* pa=new a;
--都是建立一个对象,2者有什么区别吗
两者之间是有区别的。例中,"a thea;"从栈(stack)中分配,函数结束自动清除。"a*pa = new a;"从堆中(heap)中分配,除非调用"delete"不会释放。
lagest 2002-12-19
  • 打赏
  • 举报
回复
->rushman(一线天) :-)

a thea ;和 a* pa=new a;
都是建立一个对象,2者有什么区别吗?比如在内存分配上 等方面。。。

rushman 2002-12-19
  • 打赏
  • 举报
回复
lagest() :
--不过好象类,b,c里面的virtual void print(){cout<<"Class B"<<endl;}
-- ~~~~~`~~`不用也可以的吧??
是可以不用。刚刚在另一个贴子上才谈到这个问题。
记不清是那一个了:(
如果子类重载父类中的虚函数,默认的,他还是虚函数。
lagest 2002-12-19
  • 打赏
  • 举报
回复
a thea ;和 a* pa=new a;
都是建立一个对象,2者有什么区别吗?比如在内存分配上 等方面。。。
liu_feng_fly 2002-12-19
  • 打赏
  • 举报
回复
#include "stdafx.h"

#include <iostream.h>

class a{
public:
virtual void print(){cout<<"Class A"<<endl;}
};

class b:public a{
public:
virtual void print(){cout<<"Class B"<<endl;}
};

class c:public a{
public:
virtual void print(){cout<<"Class C"<<endl;}
};
int main(int argc, char* argv[]){
a * pa;
a thea;
b theb;
c thec;

pa = &thea;
pa->print();
// delete pa;

pa = &theb;//父类指针指向子类对象
pa->print();
// delete pa;

pa = &thec;//父类指针指向子类对象
pa->print();
// delete pa;
return 0;
}
不用delete就可以得到正确的结果
lagest 2002-12-19
  • 打赏
  • 举报
回复
hehe是啊是啊 引用一下
不过好象类,b,c里面的virtual void print(){cout<<"Class B"<<endl;}
~~~~~`~~`不用也可以的吧??
rushman 2002-12-19
  • 打赏
  • 举报
回复
caozi(浩子):这是我在另一个贴子上的例子。原例中用的是new。
lagest 2002-12-19
  • 打赏
  • 举报
回复
哦 //呵呵 对 不应该用delete的
myall2002 2002-12-19
  • 打赏
  • 举报
回复
你用delete干什么呀?
rushman 2002-12-19
  • 打赏
  • 举报
回复
在应用程序中,一般都会有一个栈(一般也只有一个)和一到多个堆(一般只有一个)。
参数的传递、临时变量的分配有些函数的返回值都使用栈。对于临时变量来说,在程序中只是一个声明语句,在编译时会生成相应的分配栈的代码和初始化代码(因为类的构造函数)。当代码块(不一定是函数结束)结束时,会自动清理栈中的临时变量(析构)。
(题外话:在老的C语言中变量的声明只能放在函数开始的地方,而C++中变量的声明可以放在任何位置,原因就是现在声明一个变量有与其相对应的代码。)
堆的作用一般来说就是动态分配内存。需要时就从堆中分配一块内存,用完后再释放掉。内存的分配在C中是用malloc,在C++中用new,释放时分别用free和delete。malloc和free是函数,new和delete是操作符(可以重载)。和栈中分配临时变量一样,C++在堆中分配内存也是要初始化的,释放时也要析构(如果有必要)。
你的错误就是用delete去释放一个在栈中分配的临时变量。

65,210

社区成员

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

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