是否可以在c ++中使用私有继承时隐藏重载方法

时间:2011-11-26 20:17:18

标签: c++ inheritance private-inheritance

class Foo
{
public:
    int fn()
    {
        return 1;
    }
    int fn(int i)
    {
        return i;   //2nd fn()
    }
};
class Bar:Foo
{
public :
    Foo::fn;
};
int main(int argc, char** argv)
{
    Bar b;
    cout<<b.fn(2)<<endl;
}

可以隐藏具体类“Bar”中的fn(int)

2 个答案:

答案 0 :(得分:1)

AFAIK不,你不能在命名空间中“隐藏”名称。这与 names 有关,因此包含所有可能的同名重载。

同样,unusing无法使用名称/命名空间。

这种现象导致图书馆作者应该始终注意到的鲜为人知的ADL Pitfall


示例代码中的

PS。,当然您可以放弃/*using*/ Foo::fn;行的行......但我想这不是您的实际代码....

答案 1 :(得分:1)

只需制作基类privateprotected(使用private时默认为class,到目前为止,确定)并且不使用,但是覆盖派生类

中的函数
class Bar: private Foo
{
public:
    int fn() {return Foo::fn();}
};

这只会在条形码和int fn()中仅显示not int fn(int)。当然,编译器会大声喊叫,fn不是虚函数,但你仍然会覆盖它,但只要它只调用基类中的那个,它就完全相同。