具有不同params数的相同函数名覆盖我的基函数

时间:2014-08-13 11:08:16

标签: c++

假设我有一个基类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 ++中有更优雅的方式吗?

1 个答案:

答案 0 :(得分:0)

这是因为D2::Check_Memory 隐藏了 B::Check_Memory

当你调用函数时,编译器首先找到函数的位置,之后,它会尝试调用函数,如果函数的数量不是1,它就会开始解析函数重载。

当编译器编译d2.Check_Memory(leaf);时,它会尝试查找Check_Memory最初的内容。这很简单 - d2class 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,因此将启动解析函数重载。