继承与重定义。对Effective C++中一个条款的疑问。

idleguy 2004-09-19 02:36:32
相关条款:
Effective C++ 条款37。

绝对不要重新定义继承而来的非虚拟函数。
Never redefine an inherited nonvirtual function.


问题背景:

一个BASE Class B,大概如下:
class B
{
public:
B& operator <<(float f);
B& operator >>(float& f);
B& operator <<(int i);
B& operator >>(int& i);
……

};

现在class D要从B继承,而且需要重新定义operator <<(float)和operator >>(float).
(实际工作要求就是,class D对于float的<</>>操作是将IEEE格式的float转换成IBM格式的float,然后才是class B中operator<</>>的操作,也就是说要比class B多了一步转换工作)

class D:public B
{
D& operator <<(float f);
D& operator >>(float& f);
……
……
}



问题描述:

1、B不能更改,那么按照条款37应该不能重新定义这两个operator.可是这种情况下应该怎么处理?

2、因为D重新定义了operator <<和>>,所以class B里面所有的operator <<和>>的重载函数都被覆盖(例如operator >>(int&))。
但是class D也需要处理int以及其它类型,也就是说class D里面也需要重载这些operator.class D里面对这些非float类型的处理和B里面是一样的,那么class D的这些重载函数应该怎么写?强制类型转换?__super::?B::?或是其它的方法?那种是最好的?


谢谢。


...全文
128 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
idleguy 2004-09-19
  • 打赏
  • 举报
回复
谢谢楼上各位。

我问题中的base class是QT中的一个类,

现在只是不太明白QT这么大的一个商业化的Framework,按说写QT的应该不少大牛啊。
怎么会有这种问题。或许这么写有其它什么原因(认为这个类没必要被继承?)
不过这已经不是这个贴子讨论的范围了。

再次谢谢,结贴。
whyglinux 2004-09-19
  • 打赏
  • 举报
回复
对于这个问题,在类内定义 << 和 >> 运算符的问题不大,因为通常的使用方式是:对象 << 数据,而不是 指针->operator <<( 数据 ) 这种方式。而后者可能会出现错误。如果这样做你需要在给用户的说明中不允许使用后一种指针调用方式,而应该使用对象(或者将指针转化为对象)。

当然,要从根本上解决问题,就要对不合理设计的基类进行修改。如果基类不能被修改,又不想问题存在,只有自己重写基类了。

BluntBlade 2004-09-19
  • 打赏
  • 举报
回复
using B::operator <<(int &);
idleguy 2004-09-19
  • 打赏
  • 举报
回复
谢谢BluntBlade兄。

也就是说,除了修改Base Class,只能这样写了?
后果我清楚,这样写实在是……借用B.S说的,不优雅。

那么第二个问题呢?

2、因为D重新定义了operator <<和>>,所以class B里面所有的operator <<和>>的重载函数都被覆盖(例如operator >>(int&))。
但是class D也需要处理int以及其它类型,也就是说class D里面也需要重载这些operator.class D里面对这些非float类型的处理和B里面是一样的,那么class D的这些重载函数应该怎么写?

强制类型转换?
__super::?
B::?

或是其它的方法?那种是最好的?

谢谢。
BluntBlade 2004-09-19
  • 打赏
  • 举报
回复
按正常的写法就是了。不过在我提的那种情况下,你无法使用基类指针调用子类的<<与>>。
因为它们是静态绑定的。
daylove 2004-09-19
  • 打赏
  • 举报
回复
顶,学习中,关注
idleguy 2004-09-19
  • 打赏
  • 举报
回复
回楼上,是的,我知道,你说的就是EC里面对于条款37的解释。
这个解释我明白,但是在实际编码过程中不得不这样做的时候,有没有其它办法绕过去然后达到同样的目的?

主要的问题是Base类我是不可更改的,我只能去继承它。难道我需要重新写一分base class?
BluntBlade 2004-09-19
  • 打赏
  • 举报
回复
你试想想用父类指针去承载子类地址的时候,调用一个被重定义的非虚函数……
idleguy 2004-09-19
  • 打赏
  • 举报
回复
谢谢楼上解答。但现在的问题是Base Class已经将<<和>>定义为类成员了。

而且,Base class是不能更改的。

郁闷ing..

(具体情况是:我现在用的是QT,对其中的QDataStream继承。)
BluntBlade 2004-09-19
  • 打赏
  • 举报
回复
《EC》上已经说得很明白,<<与>>不要定义为类的成员。

64,682

社区成员

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

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