虚函数,请教

expresion 2003-08-24 12:08:46
#include<iostream.h>
#include<stdio.h>

class Base
{
public:
virtual Base* afn()
{
cout<<"This is Base class\n";
return this;
}
};

class SubClass:public Base
{
public:
SubClass* afn()
{
cout<<"This is SubClass\n";
return this;
}
};

void test(Base& x)
{
Base * b;
b=x.afn();
}

void main()
{
Base bc;
SubClass sc;
test(bc);
test(sc);
}
错误如下
C:\vc\c++\Cpp4.cpp(19) : error C2555: 'SubClass::afn' : overriding virtual function differs from 'Base::afn' only by return type or calling convention
C:\vc\c++\Cpp4.cpp(6) : see declaration of 'Base'
Error executing cl.exe.

Cpp4.exe - 1 error(s), 0 warning(s)
...全文
27 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
vldb 2003-08-24
  • 打赏
  • 举报
回复
SubClass里的afn返回类型也应该是Base *
现在把返回类型改成SubClass就不是重载基类的afn了。
kundy 2003-08-24
  • 打赏
  • 举报
回复
同意 aflyinghorse() ( ) 的说法!

我在.net(使用VC7.0)下调试程序通过!

子类SubClass的SubClass* afn()函数重载了基类的afn()函数,返回指向子类SubClass类型的指针,而该指针是和指向基类Base的指针是类型兼容的,即允许test(sc)操作!
jp311 2003-08-24
  • 打赏
  • 举报
回复
虚函数中的返回值是可以不同的,这是标准支持的
看看MORE EFFECTIVE C++ ITEM 25看看别人的virtual copy constructor是怎么写的
VC6对标准的支持太差
asdmax 2003-08-24
  • 打赏
  • 举报
回复
重载无错,调用有错
sevecol 2003-08-24
  • 打赏
  • 举报
回复
楼主的代码是符合C++的标准的

covariant return type

aflyinghorse 2003-08-24
  • 打赏
  • 举报
回复
不同意楼上的。
楼主的程序是正确的,在dev-cpp4.9.8.0下可以正确运行
vc6通不过是因为它不符合C++标准
允许这样做就可以实现虚构造函数
davidwoo 2003-08-24
  • 打赏
  • 举报
回复
返回值不同不是分别虚汗数的条件
参数个数和类型是判别虚函数的条件
wbh0360 2003-08-24
  • 打赏
  • 举报
回复
class SubClass:public Base
{
public:
SubClass* afn()
{
cout<<"This is SubClass\n";
return this;
}
};
实际上重载了afn(),当执行test(sc);时,就会照成歧义,因为两个afn()
参数相同,无法分辨!
要想用虚函数,函数头必须完全相同!
CslQy 2003-08-24
  • 打赏
  • 举报
回复
按照二楼所说的应该是楼主的真正意图。
按照二楼所说的,应该算是子类重新写父类的函数,这样能成功的原因是父类的函数事虚函数,这也正是楼上所说的。
MFC大部分类都是这样做的。
Andy84920 2003-08-24
  • 打赏
  • 举报
回复
同意楼上!
这两个函数没办法区分了!
不过,不是有,继承类的对象调用的应该就是自己重新定义的函数吗?
如果没有重新定义函数,就用基类的函数呀?
有没有这样的呀?
就是说没有重新定义下就用基类的,有重新定义就用自己的!
CslQy 2003-08-24
  • 打赏
  • 举报
回复
关于函数的重载是这样的:只有返回值不同的函数不叫作重载。
你的子类和父类的那两个函数只有返回值不同,编译器会报错的。

69,336

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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