Можно ли скрыть перегруженный метод при использовании частного наследования в 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 не является виртуальной функцией, но вы все равно переопределяете ее, но пока он вызывает только функцию в базовом классе, она все та же.