如何在子类中改写父类中的virtual函数?

vn68214 2007-05-30 09:47:50
class base
{
public:
virtual base* clone()
{
return this;
}
};

class sub: public base
{
public:
virtual sub* clone()
{
return this;
}
};
我想用clone分别返回子类和父类的指针
...全文
364 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
taodm 2007-05-31
  • 打赏
  • 举报
回复
哎,我在csdn做的最多的一件事就是让人扔了VC6
一直在想,是不是应该版主发个置顶贴了。
xuejinn 2007-05-31
  • 打赏
  • 举报
回复
mark
zycy 2007-05-31
  • 打赏
  • 举报
回复
偶在vc2005下一点儿问题都没有
int main()
{
base* bp=new base();
sub* sp=new sub();
long i=(long)bp->clone();
long j=(long)sp->clone();
bp=sp;
long k=(long)bp->clone();
return 0;
}
完全正常执行
Vitin 2007-05-30
  • 打赏
  • 举报
回复
此外,clone是否返回一个新的对象,是由类设计者决定的,要看设计期望的语义是什么。因此,不能说LZ的设计就是错的。
返回值协变是面向对象中比较新的发展,在98年的C++标准中通过。VC6等在包括这一点在内的许多方面都没能全面支持98标准,有技术原因(修改比较困难...),有成本原因(已经开发很长时间了...),也有商业原因(不能落后于对手...)。总之从VC6上得到的,可能与C++标准南辕北辙。要用VC系列,还是用VC8吧,98版C++标准的新特性,几乎都支持了。
Vitin 2007-05-30
  • 打赏
  • 举报
回复
其实C++标准是支持虚函数的返回值协变的,但是早期的一些编译器(如VC6)还没有做到这一点,所以报错了;而现在有很多编译器(如VS2005中的VC8)已经支持它了,因此LZ的程序在VC8上是没有语法问题的。

返回值协变是指派生类的返回值可以是基类的返回值的一个派生类。如:
C* A::fun();
D* B::fun();
B是A的派生类,D是C的派生类,则A::fun可以定义为虚函数,且B::fun有效地覆盖(Override)A::fun。
canybox 2007-05-30
  • 打赏
  • 举报
回复
virtual base* clone()
与virtual sub* clone()

你的子类函数不要更改返回类型.

其实这种情况你子类可以不用重载,只要实际类型不同函数自然定位在相应的继承体系.
lightnut 2007-05-30
  • 打赏
  • 举报
回复
//完整的例子, VC2005编译运行通过
#include <iostream>

class base
{
public:
base() {}

base (base const& other){}

virtual ~base(){}

virtual base* clone() const
{
return new base(*this);
}
};

class sub: public base
{
public:
sub() {}
sub(sub const& other)
:base(other){}
virtual ~sub(){}

virtual sub* clone() const
{
return new sub(*this);
}
};

int main()
{
using namespace std;

base *pb;
sub s;
pb=&s;
cout<<(typeid(*pb).name())<<endl;
base b;
pb=&b;
cout<<(typeid(*pb).name())<<endl;


system("pause");

return 0;
}

vn68214 2007-05-30
  • 打赏
  • 举报
回复
base *pb;
sub s;
pb=&s;
cout<<(typeid(*pb).name())<<endl;
base b;
pb=&b;
cout<<(typeid(*pb).name())<<endl;
这样测试
vn68214 2007-05-30
  • 打赏
  • 举报
回复
c:\documents and settings\vn\桌面\cpp3.cpp(65) : error C2555: 'sub::clone' : overriding virtual function differs from 'base::clone' only by return type or calling convention
还是有错啊,就是原来那个错
lightnut 2007-05-30
  • 打赏
  • 举报
回复
人家这个是在实现Prototype模式呀:)
  • 打赏
  • 举报
回复
你先说说你想怎么使用这样的接口吧
lightnut 2007-05-30
  • 打赏
  • 举报
回复
//class sub 错误:)
class sub: public base
{
public:
sub(sub const& other)
:base(other){}

virtual sub* clone() const
{
return new sub(*this);
}
};

lightnut 2007-05-30
  • 打赏
  • 举报
回复
class base
{
public:
base (base const& other){}

virtual base* clone() const
{
return new base(*this);
}
};

class sub: public base
{
public:
sub(sub const& other)
:base(other){}

virtual sub* clone() const
{
return new sub(this);
}
};
vn68214 2007-05-30
  • 打赏
  • 举报
回复
但是父类就不能调用了啊
  • 打赏
  • 举报
回复
设计上错误,不应该使用虚函数,只需要一个子类的函数就可以了,返回子类的this指针
vn68214 2007-05-30
  • 打赏
  • 举报
回复
但是不能通过编译,我哪里不对?或者有没有别的办法?

64,646

社区成员

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

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