为何重载在继承类中不工作的
这个问题(非常常见)往往出现于这样的例子中:
#includeiostream
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
而不是象有些人猜想的那样:
PPS游戏大厅拥有近3万款海量游戏。每期精彩活动接踵而来 f(int): 3
f(double): 3.6
换句话说,在B和D之间并没有发生重载的解析。编译器在D的区域内寻找,找到了一个函数double f(double),并执行了它。它永远不会涉及(被封装的)B的区域。在C++中,没有跨越区域的重载——对于这条规则,继承类也不例外。
但是,如果我需要在基类和继承类之间建立一组重载的f()函数呢?很简单,使用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
这样,在B的f()和D的f()之间,重载确实实现了,并且选择了一个最合适的f()进行调用。查看本文来源
长沙医院哪妇科好米诺地尔效果怎么样
拉萨治疗盆腔炎多少钱
- 熬小米粥,这样一来放水煮是大错,做好5关键,香浓黏稠,有厚厚米油
- 放射科检查室冬天为什么那么冷?
- 归属江西却说吴语,江西宜春与浙江有何渊源?
- 茄子无论蒸或炒,都不能直接下锅!多花钱1步,不发黑,鲜嫩又入味
- 到群众最所需的地方去
- 徐超群:欧冠利物浦就让可能平局或赢一个,埃梅里是杯赛之王
- 益康耳穴:痤疮究竟是什么造成的?孩子的青春痘还有没有救?
- 投资者提问:董秘您好:特斯拉人形机器人是否会运用NPL专精术?贵司在NPL专精...
- LDK+多功能宅,85㎡奶油风、清新、原木、多功能
- 莱斯克:光喊口号没表现是没用的,其他球队想夺冠也要靠拜仁丢分
- 投资者提问:请问公司有没有在东南亚建厂的决意,从而提高出口的竞争力。谢谢。
- 显卡真的便宜!但买了矿卡的概率超高,电脑整机买了不得