这里发生的是重载还是改写?

ogre 2003-10-10 10:30:32
class Good{
public:

int get_a(int index)
{
return v[index];
};
};

class Better: public Good
{
public:

int get_a(int index)
{
return s[index];
};

};
...全文
56 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
soonbehere 2003-10-13
  • 打赏
  • 举报
回复
override(覆写,国内的书翻译的比较混乱) ~~~overload才是重载!!!!

以前的VC书经常犯一个常见,几乎是每本书都犯的错误。说是重载基类的某某虚函数,实际上是不对的。重载是overload,而这里应该用override。如果查一下电子版的E文书,就搞清楚了。国内把override和overload翻译得特别乱。我也不知道override竟然用哪个词翻译比较好。
BenWong1981126 2003-10-12
  • 打赏
  • 举报
回复
重写就是override覆盖吧,概念多了有点模糊!
ionlic 2003-10-11
  • 打赏
  • 举报
回复
都不是的说。
override要在virtual里
overload参数要不同
lemon520 2003-10-11
  • 打赏
  • 举报
回复
在没有引入基类函数的情况下,派生类无法重载基类的函数,域不一样。
所以楼主这种情况可以看成子类隐藏了基类的函数(在子类中,基类的该同名函数的实现不可见)
RookieStar 2003-10-11
  • 打赏
  • 举报
回复
支持楼上既非重载也非改写的!
leyt 2003-10-10
  • 打赏
  • 举报
回复
既不是重载也不是改写,而是隐藏

重载要求:在同一类中,函数名相同,参数不同。

而改写则需定义虚函数。

ShLikeWater(若水)说的对
loveghb 2003-10-10
  • 打赏
  • 举报
回复
是重写,为什么要重写,因为可能基类的代码不妥当或者根本就是错的,然后你又没有办法去修改它,但是这个类又要用它,怎么办呢?
除了重写还有什么办法呢?
给我分吧!

ShLikeWater 2003-10-10
  • 打赏
  • 举报
回复
是隐藏,请参考下面的代码。
#include <iostream.h>
class Base
{
public:
virtual void f(float x){ cout << "Base::f(float) " << x << endl; }
void g(float x){ cout << "Base::g(float) " << x << endl; }
void h(float x){ cout << "Base::h(float) " << x << endl; }
}; class Derived : public Base
{
public:
virtual void f(float x){ cout << "Derived::f(float) " << x << endl; }
void g(int x){ cout << "Derived::g(int) " << x << endl; }
void h(float x){ cout << "Derived::h(float) " << x << endl; }
};
void main(void)
{
Derived d;
Base *pb = &d;
Derived *pd = &d;
// Good : behavior depends solely on type of the object
pb->f(3.14f); // Derived::f(float) 3.14
pd->f(3.14f); // Derived::f(float) 3.14
// Bad : behavior depends on type of the pointer
pb->g(3.14f); // Base::g(float) 3.14
pd->g(3.14f); // Derived::g(int) 3 (surprise!)
// Bad : behavior depends on type of the pointer
pb->h(3.14f); // Base::h(float) 3.14 (surprise!)
pd->h(3.14f); // Derived::h(float) 3.14
}
ezhou 2003-10-10
  • 打赏
  • 举报
回复
当然是改写。
重载要求:
在同一类中,函数名相同,参数不同。
AaronChan 2003-10-10
  • 打赏
  • 举报
回复
应该是改写吧!
Jinhao 2003-10-10
  • 打赏
  • 举报
回复
不知道,反正不是overload

class Good{
public:

virtual int get_a(int index) //为什么不这样呢?
{
return v[index];
};
};

class Better: public Good
{
public:

int get_a(int index)
{
return s[index];
};

};
ogre 2003-10-10
  • 打赏
  • 举报
回复
override 不是只发生在virtual function member 身上吗?
liao2001 2003-10-10
  • 打赏
  • 举报
回复
重载了,如想调用基类的get_a,请使用作用域,详见书《xxx》[xxx页]
jyfcsdn 2003-10-10
  • 打赏
  • 举报
回复
是override, 并且覆盖隐藏了父类的函数(所有名称为get_a的函数在Better中都不可见了,除了自己写的那个)
robbie24 2003-10-10
  • 打赏
  • 举报
回复
不是override也不是overload~
class Better中的非虚拟函数get_a把继承而来的另一个get_a给hide掉了~
如果你不想使用多态性(也就是通过基类的pointer或者reference来操作的话),那么这样做是可以的,从某种程度上来说是可以.(笑),因为只有通过object的调用,那么Better的使用者很清楚他在做什么,他要的是哪个get_a.
如果你即将使用多态性(一般也如此),那么上面的代码就有些问题.别去override继承而来的非虚拟函数,这样会隐藏掉先前的非虚拟函数,直接致'精神分裂'.(笑)
xjl999 2003-10-10
  • 打赏
  • 举报
回复
如果在同一个类中,函数名相同,参数不同叫重载;
如果一个类继承了另外的一个类,就如楼主的这种情况的话,叫做隐藏;
如果一个类继承了另外的一个类,在楼主的函数前面加上virtual,那么就叫做覆盖!
ogre 2003-10-10
  • 打赏
  • 举报
回复
因为C++的编译器允许这种语法现象存在,可是我又说出这是什么。
如果在积累中加了virtual就没有讨论的必要了

64,648

社区成员

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

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