问一个关于clone函数的问题

zzunicholas 2006-08-24 03:25:13
基类A有个clone函数A* clone()
派生类也应该有个clone函数B* clone()

我是想基类A的clone函数是做成虚函数呢,还是就是这个样子,然后派生类隐藏基类同名函数?
...全文
202 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
QQ_370566617 2006-08-29
  • 打赏
  • 举报
回复
如果是虚函数
class B : public A
{
public:
virtual A* clone();//krh2001(边城浪子)所说的返回基类

但是我要是这样用会出问题

B b;
B* pB = b.clone(); //会报错的啊?B* pB = (B*)b.clone();也不行

怎么办???
jerry 2006-08-28
  • 打赏
  • 举报
回复
楼上的,也不用返回void* 返回最深的那个基类就可以了
jerry 2006-08-28
  • 打赏
  • 举报
回复
VC6 肯定不支持协变返回, 但不知道VC7以后有是否支持. GCC是支持的
QQ_370566617 2006-08-28
  • 打赏
  • 举报
回复
如果你用VC6 好像不支持协变返回

不过你可以返回void *

这样返回就相同了

使用的时候用强制转化加上类型识别就行了
sankt 2006-08-24
  • 打赏
  • 举报
回复
#include<iostream>
using namespace std;

class A
{
public:
virtual A* clone();
virtual ~A()
{
//
cout<<"A destructor."<<endl;
}
};

A* A::clone()
{
cout<<"In class A."<<endl;
return new A();
}

class B : public A
{
public:
virtual B* clone();
virtual ~B()
{
//
cout<<"B destructor."<<endl;
}

};

B* B::clone()
{
cout<<"In class B."<<endl;
return new B();
}

int main()
{
B b;
A & ref = b;

A* pa = ref.clone();
delete pa;
system("pause");
return 0;
}
cunsh 2006-08-24
  • 打赏
  • 举报
回复
参考<<c++必知必会>>的条款31 协变返回类型
cunsh 2006-08-24
  • 打赏
  • 举报
回复
书上说这种情况是协变返回类型.
漂流的代码 2006-08-24
  • 打赏
  • 举报
回复
应该做成虚函数。 而且返回之的类型也必须是一致的
cunsh 2006-08-24
  • 打赏
  • 举报
回复

这种情况可以是虚函数的.
zzunicholas 2006-08-24
  • 打赏
  • 举报
回复
如果做成所虚函数,但是他们的返回都不同啊

在我印象当中,派生类的虚函数不是要和基类返回和参数要一样吗?

如果不一样不就不是虚函数了?
sankt 2006-08-24
  • 打赏
  • 举报
回复
虚函数
jerry 2006-08-24
  • 打赏
  • 举报
回复
这个肯定应该是此虚函数 .

64,642

社区成员

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

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