Witam.
W książce A. Allaina "Przewodnik dla początkujących C++" jest takie zadanie:
Zaimplementuj funkcję sortuj pobierającą wektor wskaźników do klasy interfejsowej „Porownywalne”, która definiuje metodę „porownaj(Porownywalne& inny)” i zwraca 0, kiedy obiekty są takie same, 1, kiedy porównywany obiekt jest większy od obiektu „inny”, oraz -1, gdy obiekt jest mniejszy od obiektu „inny”. Napisz klasę implementującą ten interfejs, utwórz kilka jej instancji i posortuj je.
I zrobiłem to w ten sposób ( jakość kodu ma mniejsze znaczenie)
class Interface
{
public:
virtual int compare(Interface&) = 0;
virtual int getValue() = 0;
};
class Sort : public Interface
{
int value;
public:
int getValue() { return value; }
int compare(Interface& another) override
{
if(this->getValue() > another->getValue()) return 1;
else if(this->getValue() < another->getValue()) return -1;
else return 0;
}
Sort(int n) : value{n} {}
};
void sort(std::vector<Interface*>& numbers)
{
for(int i = 0; i < numbers.size(); ++i)
{
for(int j = 0; j < numbers.size() - 1; ++j)
{
if(numbers[j]->compare(numbers[j + 1]) == 1)
{
std::swap(numbers[j], numbers[j + 1]);
}
}
}
}
W związku z tym mam takie pytanie. Czy ja powinienem do pól klasy pochodnej dostawać się z wirtualnych metod klasy bazowej,
czy może ten obiekt castować w dół i bezpośrednio
już z klasy pochodnej pobierać?
No chyba, że obydwa pomysły są złe, to prosiłbym o poprawne nakierowanie na dobre rozwiązanie.
Dzięki za odpowiedz i pozdrawiam.