荔园在线

荔园之美,在春之萌芽,在夏之绽放,在秋之收获,在冬之沉淀

[回到开始] [上一篇][下一篇]


发信人: Dreamer (我与萤火虫), 信区: SoftDev
标  题: 【C++】[FAQ]为何无法在派生类中重载?
发信站: 荔园晨风BBS站 (Wed Jun  9 13:04:45 2004), 站内信件


Q: 为何无法在派生类中重载?
A: 这个问题常常是由这样的例子中产生的:
#include<iostream>
using namespace std;

class B {
public:
int f(int i) { cout << "f(int): "; return i+1; }
// ...
};

class D : public B {
public:
double f(double d) { cout << "f(double): "; return d+1.3; }
// ...
};

int main()
{
D* pd = new D;

cout << pd->f(2) << '\n';
cout << pd->f(2.3) << '\n';
}


程序运行结果是:
f(double): 3.3 f(double): 3.6
而不是某些人(错误地)猜想的那样:
f(int): 3 f(double): 3.6
换句话说,在D和B之间没有重载发生。你调用了pd->f(),编译器就在D的名字域里
找啊找,找到double f(double)后就调用它了。编译器懒得再到B的名字域里去看
看有没有哪个函数更符合要求。记住,在C++中,没有跨域重载——继承类和基类
虽然关系很亲密,但也不能坏了这条规矩。详见《The Design and Evolution
of C++》或者《The C++ Programming Language》第三版。

不过,如果你非得要跨域重载,也不是没有变通的方法——你就把那些函数弄到同
一个域里来好了。使用一个using声明就可以搞定。

class D : public B {
public:
using B::f; // make every f from B available
double f(double d) { cout << "f(double): "; return d+1.3; }
// ...
};


这样一来,结果就是
f(int): 3
f(double): 3.6
重载发生了——因为D中的那句 using B::f 明确告诉编译器,要把B域中的f引入
当前域,请编译器“一视同仁”。






--
如果你真的爱萤火虫,你就不应该将她困在瓶子里;
如果你真的爱萤火虫,你应该放开她,让她在天空中自由自在地飞!
虽然你会不舍得她,但是最终你就会明白这样你才真正拥有了她!

※ 来源:·荔园晨风BBS站 bbs.szu.edu.cn·[FROM: 192.168.0.223]


[回到开始] [上一篇][下一篇]

荔园在线首页 友情链接:深圳大学 深大招生 荔园晨风BBS S-Term软件 网络书店