Можно ли скрыть перегруженный метод при использовании частного наследования в C++

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;
}

можно скрыть fn(int) в конкретном классе "Bar"

2 ответа

Решение

AFAIK нет, вы не можете "скрыть" имена из пространств имен. Это относится к именам, так что включает в себя все возможные перегрузки одного и того же имени.

Точно так же нет никакого способа unusing имя / пространство имен.

Именно это явление приводит к довольно малоизвестной ловушке ADL, о которой авторы библиотек всегда должны знать.


PS. в примере кода, конечно, вы можете просто оставить строку, говоря /*using*/ Foo::fn; линия... но я думаю, что это не ваш реальный код....

Просто сделайте базовый класс private, protected (его private по умолчанию при использовании classпока все нормально) и не используйте, но переопределите функцию в производном классе

class Bar: private Foo
{
public:
    int fn() {return Foo::fn();}
};

Это только сделает только int fn() видно в баре и not int fn(int), Конечно, компилятор громко закричит, что fn не является виртуальной функцией, но вы все равно переопределяете ее, но пока он вызывает только функцию в базовом классе, она все та же.

Другие вопросы по тегам