【转载】C++ 子类不能重载父类函数 解决方法

转自:http://hi.baidu.com/imtoby/item/29eb9ff302971f13ce9f32d5

这个问题常常是由这样的例子中产生的:

#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引入当前域,请编译器“一视同仁”。

此条目发表在 C++ 分类目录,贴了 标签。将固定链接加入收藏夹。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

您可以使用这些HTML标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>