C++, конфликт между библиотечной функцией и унаследованной функцией класса

      #include <iostream>
#include <unistd.h>
using namespace std;
class A{
    public:
        bool close(){ return true; }
};
class B: public A{
    public:
        void fun(){
            (void) close(1);
        }
};
int main() {
    B b;
    b.fun();
    return 0;
}

В классе BI хочу вызвать функцию close(1), которая есть в библиотеке unistd.h. К вашему сведению: close(int fileDes) используется для закрытия файловых дескрипторов в процессе.

Итак, как победить проблему. Я получил следующую ошибку:

      source.cpp: In member function 'void B::fun()':
source.cpp:11:27: error: no matching function for call to 'B::close(int)'
   11 |             (void) close(1);
      |                           ^
source.cpp:6:14: note: candidate: 'bool A::close()'
    6 |         bool close(){ return true; }
      |              ^~~~~
source.cpp:6:14: note:   candidate expects 0 arguments, 1 provided

Итак, как решить проблему, чтобы она вызывала функцию в файле unistd.h.

1 ответ

В области функции-членаfunимя как неквалифицированное имя ищется в области видимости класса

          void fun(){
        (void) close(1);
    }

И действительно, есть еще одна функция-членcloseв базовом классе с таким именем.

Поэтому компилятор выбирает эту функцию.

Если вы хотите использовать функцию из пространства имен, используйте полное имя, например,

          void fun(){
        (void) ::close(1);
    }
Другие вопросы по тегам