看看这是为什么不能运行?
#include <iostream>
#include <string>
using namespace std;
class Base
{
public:
virtual void play()const{
cout<<"It's a Base class!"<<endl;
}
virtual Base* clone(){
Base* ptr=new Base;
*ptr=*this;
return ptr;
}
virtual ~Base(){
delete ptr;
}
};
class derive1 :public Base
{
public:
void play()const{
cout<<"It's a derive1 class!"<<endl;
}
derive1* cloen(){
derive1 *ptr=new derive1;
*ptr=*this;
return ptr;
}
~derive1(){
delete ptr;
}
};
class derive2 :public Base
{
public:
void play()const{
cout<<"It's a derive2 class!"<<endl;
}
derive2* clone(){
derive2 *ptr=new derive1;
*ptr=*this;
return ptr;
}
~derive2(){
delete ptr;
}
};
int main()
{
derive1 a;
derive2 b;
Base *e=&a;
Base *f=&b;
(e->clone())->play();
(f->clone())->play();
return 0;
}
哪位仁兄能告诉我原因
问题点数:20、回复次数:5Top
1 楼snipersu()回复于 2003-05-04 21:03:52 得分 5
#include <iostream>
#include <string>
using namespace std;
class Base
{
public:
virtual void play()const{
cout<<"It's a Base class!"<<endl;
}
virtual Base* clone(){
Base* ptr=new Base;
*ptr=*this;
return ptr;
}
virtual ~Base(){
//delete ptr;
}
};
class derive1 :public Base
{
public:
void play()const{
cout<<"It's a derive1 class!"<<endl;
}
Base* cloen(){
derive1 *ptr=new derive1;
*ptr=*this;
return ptr;
}
~derive1(){
// delete ptr;
}
};
class derive2 :public Base
{
public:
void play()const{
cout<<"It's a derive2 class!"<<endl;
}
Base* clone()//
{
derive2 *ptr=new derive2;
*ptr=*this;
return ptr;
}
~derive2(){
//delete ptr;
}
};
int main()
{
derive1 a;
derive2 b;
Base *e=&a;
Base *f=&b;
(e->clone())->play();
(f->clone())->play();
return 0;
}
上边这样可以通过,不过你的代码的问题很大.
ptr不是成员变量所以不能在析构函数中调用.
即使这样还存在内存泄漏.
建议你再看看书,在改改.
拙见!
有问题共同探讨.
Top
2 楼snipersu()回复于 2003-05-04 21:07:45 得分 5
还有这行*ptr=*this;
如果你让ptr成为类成员变量且为指针型的话,要提供拷贝构造函数和operator=(这方面建议你看看effective c++).Top
3 楼sirouni2003(嘿嘿)回复于 2003-05-04 21:41:45 得分 5
1 你的ptr不是类的成员,所以不应该再析构汉书中delete
2 如果ptr不是成员,而你的类没有什么特殊的用途,你编写的clone(),没有实际的意义。如果必须写clone(),只要像上面所说的提供operaror=和拷贝构造函数就可以了。Top
4 楼njustar(abstract thinking)回复于 2003-05-05 23:03:21 得分 5
#include "stdafx.h"
#include <iostream>
using namespace std;
class base
{
public:
base()
{
}
virtual void display()
{
cout<<"this is base call"<<endl;
}
virtual void* myclone()
{
base* tmp=new base();
*tmp=*this;
return (void*)tmp;
}
};
class derive:public base
{
public:
void display()
{
cout<<"this is derive call"<<endl;
}
void* myclone()
{
derive* tmp=new derive;
*tmp=*this;
return (void*)tmp;
}
};
class derive2:public base
{
public:
void display()
{
cout<<"this is derive2 call"<<endl;
}
void* myclone()
{
derive2* tmp=new derive2;
*tmp=*this;
return (void*)tmp;
}
};
int main(int argc, char* argv[])
{
base* a=new derive;
base* c=new derive2;
a->display();
base* b=(base*)a->myclone();
base* d=(base*)c->myclone();
d->display();
b->display();
return 0;
}
Top




