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

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

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

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


#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';
	return 0;
}
/*
f(double): 3.3
f(double): 3.6
Press any key to continue
*/

#include <iostream>
using namespace std;
class B{ 
public: 
int f(int i) { cout << "f(int): "; 
return i+1;
 } 
// ... 
};
class D : public B {
public:
	using B::f;
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';
	return 0;
}
/*
f(int): 3
f(double): 3.6
Press any key to continue
*/



评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值