Наследование бинарной перегрузки? Здравствуйте, мне нужно привести родительский класс к дочернему , чтобы использовать перегруженный оператор дочернего класса. Сам перегруженный оператор задается как дружественныя функция, так как принимает два значения .
pointClass[0] - указатель который инициализирован как бызовый классvoid SplitString(int choice)
{
char string[100];
system("clear");
cout > string;
Str_Indef strIndef(string);
strIndef = strIndef + (Str_Indef)*pointClass[0]; // Так я привожу и не работает
strIndef.Print();
Pause();
}
Код перегрузки.const Str_Indef operator +(const Str_Indef& right, const Str_Indef& left)
{
std::cout << "ПЕРЕГРУЗКА ОПЕРАЦИИ + [Строка-Идетификатор]" << std::endl;
char *pointerChar = new char[right.size + left.size-1];
strcpy(pointerChar, left.p_char);
strcat(pointerChar, right.p_char);
Str_Indef returnString;
returnString.p_char = pointerChar;
returnString.size = strlen(pointerChar);
return returnString;
};
Сама перегрузка реализована в виде дружественной функции , а они как известно не могут быть виртуальными, что и не позволяет их наследовать.

21 Авг 2019 в 07:07
211 +1
0
Ответы
1

Чтобы достичь цели наследования бинарной перегрузки оператора в дочернем классе, вам следует определить этот оператор в базовом классе как виртуальную функцию. В дочернем классе вы перегрузите эту функцию с помощью оператора +. Вот пример вашего кода с учётом этих изменений:

class Str_Indef {
protected:
char* p_char;
int size;
public:
virtual Str_Indef operator+(const Str_Indef& right) {
std::cout << "ПЕРЕГРУЗКА ОПЕРАЦИИ + [Строка-Идентификатор]" << std::endl;
char *pointerChar = new char[size + right.size-1];
strcpy(pointerChar, p_char);
strcat(pointerChar, right.p_char);
Str_Indef returnString;
returnString.p_char = pointerChar;
returnString.size = strlen(pointerChar);
return returnString;
}
// другие методы и конструкторы класса
};
// Дочерний класс, наследующийся от Str_Indef
class MyStrIndef : public Str_Indef {
public:
MyStrIndef operator+(const MyStrIndef& right) {
std::cout << "ПЕРЕГРУЗКА ОПЕРАЦИИ + [Мой Строка-Идентификатор]" << std::endl;
char *pointerChar = new char[size + right.size-1];
strcpy(pointerChar, p_char);
strcat(pointerChar, right.p_char);
MyStrIndef returnString;
returnString.p_char = pointerChar;
returnString.size = strlen(pointerChar);
return returnString;
}
// другие методы и конструкторы класса
};
void SplitString(int choice) {
char string[100];
system("clear");
cout << "Введите значение второго операнда" << endl;
cin >> string;
Str_Indef strIndef(string);
MyStrIndef myStrIndef(string);
Str_Indef result1 = strIndef + (Str_Indef)*pointClass[0];
MyStrIndef result2 = myStrIndef + (MyStrIndef)*pointClass[0];
result1.Print();
result2.Print();
Pause();
}

Теперь ваш дочерний класс MyStrIndef перегружает оператор +, наследованный от родительского класса Str_Indef. Когда вы вызываете + для объектов MyStrIndef, будет использоваться перегрузка этого оператора из дочернего класса.

20 Апр в 13:07
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Название заказа не должно быть пустым
Введите email
Бесплатные доработки
Гарантированные бесплатные доработки
Быстрое выполнение
Быстрое выполнение от 2 часов
Проверка работы
Проверка работы на плагиат
Интересные статьи из справочника
Поможем написать учебную работу
Название заказа не должно быть пустым
Введите email
Доверьте свою работу экспертам
Разместите заказ
Наша система отправит ваш заказ на оценку 92 718 авторам
Первые отклики появятся уже в течение 10 минут
Прямой эфир