虚函数继承问题

stackoverlow 2011-08-26 08:38:57
一个基类的const成员虚函数,然后在派生类里重定义了这个函数
但是用派生类对象调用这个函数的时候实际调用的却是基类的版本
后来发现是派生类版本的这个函数后面少了个const,加上去就成功调用派生类版本
这是为什么啊?派生类版本必须和基类版本是不是const成员函数也要一样的?
求教。。
...全文
134 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
z8323664 2011-08-27
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 pathuang68 的回复:]

利用虚函数实现多态,是重写而非重载。重载是静态绑定的概念,而虚函数的多态是动态绑定的概念。

利用虚函数实现多态时,派生类中的函数声明方式要和基类中一模一样,比如基类中有const,那么派生类中重写时也必须有const,否则就形成了重载(overload),而非重写(override或者overwrite)了。2楼说的那种情况是个例外,事实上,那种情况在实际中用得不算太多。
[/Quote]

讲的挺清楚的,以前老师在上课的时候讲函数的时候叫重载, 然后将虚函数的时候还是重载。很容易让人 把这两个概念搞在一起。。。后面才发现这完全是两码事!!!!
stackoverlow 2011-08-27
  • 打赏
  • 举报
回复
看了下primer清楚多了,看来primer好多细节没仔细看啊~
二点五次元 2011-08-26
  • 打赏
  • 举报
回复
基于const的重载。

成员函数是有隐含的this指针形参的。

如果成员函数为const,此隐含指针为指向const对象的指针。

如果不是const,为指向非const对象的指针。

所以成员函数是否为const其实是影响形参的类型的。
半兽人写程序 2011-08-26
  • 打赏
  • 举报
回复
1 楼主,别搞糊涂了。函数重载和虚函数,然后在子类的重载完全两回事。一个是运行时的,一个不是。
2 void fun1() const ;void fun1() 是两个完全不同的函数。所以你派生类必须分别继承。
stackoverlow 2011-08-26
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 pathuang68 的回复:]
在一个类中:
void fun();
void fun() const;
可以形成有效的重载,也就是说这是两个不同的函数。
[/Quote]
突然想起来,既然不是一个函数但是函数名是一样的,按道理调用时应该是先在派生类里找到名字,派生类里的这个函数屏蔽了基类的同名函数
那为什么调用的不是派生类的而是基类的这个函数?
pathuang68 2011-08-26
  • 打赏
  • 举报
回复
利用虚函数实现多态,是重写而非重载。重载是静态绑定的概念,而虚函数的多态是动态绑定的概念。

利用虚函数实现多态时,派生类中的函数声明方式要和基类中一模一样,比如基类中有const,那么派生类中重写时也必须有const,否则就形成了重载(overload),而非重写(override或者overwrite)了。2楼说的那种情况是个例外,事实上,那种情况在实际中用得不算太多。
tuning工作者 2011-08-26
  • 打赏
  • 举报
回复
c++ 编辑器会选择比较自由的,所以有没加const的就会调用
pathuang68 2011-08-26
  • 打赏
  • 举报
回复
在一个类中:
void fun();
void fun() const;
可以形成有效的重载,也就是说这是两个不同的函数。
pathuang68 2011-08-26
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 xuqiqw 的回复:]

引用 3 楼 yby4769250 的回复:
另外的问题,你的虚函数写成const?这样的话,虚函数有什么意义呢?const成员函数被限定为不能修改对象的成员,而虚函数恰恰就是可能对成员有不同的操作而表现出多态,我还真没把虚函数写成多态过呢,可能孤陋寡闻了

虚函数成const只是不能修改对象的数据,但操作方式可以不同应该是没什么问题吧
就是一个primer上的售书折扣问题,这个虚函数是……
[/Quote]

没有“虚函数一般不写成const”这样的限制。
stackoverlow 2011-08-26
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 yby4769250 的回复:]
另外的问题,你的虚函数写成const?这样的话,虚函数有什么意义呢?const成员函数被限定为不能修改对象的成员,而虚函数恰恰就是可能对成员有不同的操作而表现出多态,我还真没把虚函数写成多态过呢,可能孤陋寡闻了
[/Quote]
虚函数成const只是不能修改对象的数据,但操作方式可以不同应该是没什么问题吧
就是一个primer上的售书折扣问题,这个虚函数是统计总价格的,基类是正常价格,派生类有个折扣数据成员,在统计价格的时候价格打折
虚函数一般不写成const?为什么啊不太理解
yby4769250 2011-08-26
  • 打赏
  • 举报
回复
另外的问题,你的虚函数写成const?这样的话,虚函数有什么意义呢?const成员函数被限定为不能修改对象的成员,而虚函数恰恰就是可能对成员有不同的操作而表现出多态,我还真没把虚函数写成多态过呢,可能孤陋寡闻了
maoxing63570 2011-08-26
  • 打赏
  • 举报
回复
With one exception, the declaration (Section 7.4 , p. 251 )of a virtual function in the derived class must
exactly match the way the function is defined in the base. That exception applies to virtuals that return
a reference (or pointer) to a type that is itself a base class. A virtual function in a derived class can
return a reference (or pointer) to a class that is publicly derived from the type returned by the base class
function.
maoxing63570 2011-08-26
  • 打赏
  • 举报
回复
除了返回类型可以不一样外,其它都必须一样

64,654

社区成员

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

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