Можно ли скрыть перегруженный метод при использовании частного наследования в C ++ - PullRequest
1 голос
/ 27 ноября 2011
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 ]

1 голос
/ 29 ноября 2011

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

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

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

1 голос
/ 27 ноября 2011

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

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

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


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

...