Подтвердить что ты не робот

С++ проблема с перегрузкой функции в унаследованном классе

Это, возможно, вопрос о нобе, жаль об этом. Недавно я столкнулся с какой-то странной проблемой, когда пытался объединиться с некоторыми материалами высокого уровня в С++, перегрузкой функций и наследованием.

Я покажу простой пример, просто чтобы продемонстрировать проблему;

Существует два класса: classA и classB, как показано ниже:

class classA{
    public:
        void func(char[]){};    
};

class classB:public classA{ 
    public:
        void func(int){};
};

В соответствии с тем, что я знаю, classB теперь должен иметь две функции func(..), перегруженные из-за разных аргументов.

Но при попытке этого в основном методе

int main(){
    int a;
    char b[20];
    classB objB;
    objB.func(a);    //this one is fine
    objB.func(b);    //here the problem!
    return 0;
}

Он дает ошибки, поскольку метод void func(char[]){};, который находится в суперклассе, classA, не отображается int производным классом, classB.

Как я могу это преодолеть? не так ли, как перегрузка работает в С++? Я новичок в С++, но на Java, я знаю, что могу использовать что-то вроде этого.

Хотя я уже нашел этот поток, который спрашивает об аналогичных проблемах, я думаю, что два случая различны.

4b9b3361

Ответ 1

Все, что вам нужно, это using:

class classB:public classA{ 
    public:
        using classA::func;
        void func(int){};
};

Он не ищет базовый класс для func, потому что он уже нашел его в производном классе. Оператор using переносит другую перегрузку в ту же область действия, чтобы он мог участвовать в разрешении перегрузки.

Ответ 2

Хорошо объясняется, например, в этом вопросе ответы:

Почему я должен использовать "using" ключевое слово для доступа к методу базового класса?

Короче говоря, компилятор прекратит поиск методов сопоставления из родительских классов, когда найдет имя соответствующего метода в текущем классе, даже если этот метод несовместим. Я предполагаю, что это позволяет некоторым автоматическим преобразованиям типов работать более логично, без необходимости переопределять так много методов родительского класса.

Ответ 3

Если вы переопределите один вариант функции в производном классе, вам необходимо переопределить все варианты. Вы можете использовать то, что предложил JLledo или написать вариант функции в производном классе, который просто вызывает функцию базового класса той же сигнатуры.

class classA{
    public:
        void func(char[]){};    
};

class classB:public classA{ 
    public:
        void func(int){};
        void func(char[]){};
};

void classB:func(char[] ch)
{
    classA::func(ch);
}

Ответ 4

Вы должны передать аргумент типа int в

objB.func(b);    //here the problem!

bcs он был перегружен аргументом int