С++ проблема с перегрузкой функции в унаследованном классе
Это, возможно, вопрос о нобе, жаль об этом. Недавно я столкнулся с какой-то странной проблемой, когда пытался объединиться с некоторыми материалами высокого уровня в С++, перегрузкой функций и наследованием.
Я покажу простой пример, просто чтобы продемонстрировать проблему;
Существует два класса: 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, я знаю, что могу использовать что-то вроде этого.
Хотя я уже нашел этот поток, который спрашивает об аналогичных проблемах, я думаю, что два случая различны.
Ответы
Ответ 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