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