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

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

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

35

Решение

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

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

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

47

Другие решения

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

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

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

10

Если вы переопределяете один вариант функции в производном классе, вам необходимо переопределить все варианты. Вы можете использовать то, что предложил 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);
}
3

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

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

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

-4
По вопросам рекламы [email protected]