假设我有一个基类B和2个派生自它的类:
class B
{
public:
A_type* Check_Memory(const LeafInterface* leaf = 0);
}
class D1 : public B {}
class D2 : public B
{
A_type* Check_Memory(const LeafInterface* leaf, U32* faults);
}
现在,当我致电:
D1 d1;
d1.Check_Memory(leaf);
它按预期从基类调用函数,
但是当我做同样的事情时:
D2 d2;
d2.Check_Memory(leaf);
而不是从基类调用该函数,我得到以下错误: 函数不带1个参数。
我的唯一解决方案是在D2中声明调用基函数的另一个函数吗?在C ++中有更优雅的方式吗?
答案 0 :(得分:0)
这是因为D2::Check_Memory
隐藏了 B::Check_Memory
。
当你调用函数时,编译器首先找到函数的位置,之后,它会尝试调用函数,如果函数的数量不是1,它就会开始解析函数重载。
当编译器编译d2.Check_Memory(leaf);
时,它会尝试查找Check_Memory
最初的内容。这很简单 - d2
是class D2
,它有A_type* Check_Memory(const LeafInterface* leaf, U32* faults);
。之后,编译器会尝试调用它,但正如您所知,这是不可能的。更不幸的是,没有函数重载(因为A_type* Check_Memory(const LeafInterface* leaf = 0);
位于class B
。)。因此发生编译错误。
为避免这种情况,重命名函数的名称是最好的(代码越简单,代码越好)。但是,如果您不能这样做,请使用using
。
class D2 : public B
{
using B::Check_Memory;
A_type* Check_Memory(const LeafInterface* leaf, U32* faults);
}
在这种情况下,A_type* Check_Memory(const LeafInterface* leaf, U32* faults);
不会隐藏B::Check_Memory
,因此将启动解析函数重载。