Возможно, это нубский вопрос, извините за это. Недавно я столкнулся со странной проблемой при попытке возиться с некоторыми высокоуровневыми вещами в c ++, перегрузкой функций и наследованием.
Я покажу простой пример, просто чтобы продемонстрировать проблему;
Есть два класса, 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's the problem!
return 0;
}
Это дает ошибки как метод void func(char[]){};
который в суперклассе, classA
, не виден в производном классе, classB
,
Как я могу преодолеть это? не так ли перегрузка работает в с ++? Я новичок в C ++, но в Java я знаю, что могу использовать что-то вроде этого.
Хотя я уже нашел эта тема который спрашивает о похожих проблемах, я думаю, что эти два случая разные.
Все, что вам нужно, это using
:
class classB:public classA{
public:
using classA::func;
void func(int){};
};
Он не ищет в базовом классе func
потому что он уже нашел один в производном классе. using
Оператор переносит другую перегрузку в ту же область, чтобы он мог участвовать в разрешении перегрузки.
Это хорошо объясняется, например, в ответах на этот вопрос:
Почему я должен использовать "с помощью" ключевое слово для доступа к моему методу базового класса?
Короче говоря, компилятор прекратит поиск подходящих методов из родительских классов, когда найдет совпадающее имя метода в текущем классе, даже если этот метод несовместим. Я предполагаю, что это позволяет некоторым автоматическим преобразованиям типов работать более логично, без необходимости переопределять так много методов родительского класса.
Если вы переопределяете один вариант функции в производном классе, вам необходимо переопределить все варианты. Вы можете использовать то, что предложил 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);
}
Вы должны передать аргумент типа int в
objB.func(b); //here's the problem!
bcs перегружен аргументом int