Dziedziczenie i klasy wirtualne

0

Witam, mam następujący problem: Mam klasę bazową Pracownik i w niej funkcję wirtualną Wynagrodzenie, do tego dopisane dwie klasy dziedziczące. W każdej z tych dwóch klas Wynagrodzenie jest inaczej obliczane. I teraz mój problem: muszę napisać trzecią klasę dziedziczącą z klasy Pracownik, tylko że tam Wynagrodzenie ma się równać sumie wartości wynagrodzeń z dwóch poprzednich klas i nie wiem jak napisać tą trzecią klasę.

0
dzyngis napisał(a)

... muszę napisać trzecią klasę dziedziczącą z klasy Pracownik, tylko że tam Wynagrodzenie ma się równać sumie wartości wynagrodzeń z dwóch poprzednich klas

[???] czym niby mają być te "poprzednie klasy"
Czy to ma być tak:

class Pracownik {
      virtual double Wynagrodznie() = 0;
};

class Nauczyciel : public Pracownik {
      virtual double Wynagrodznie() { return 777; };
};

class Wozny : public Pracownik {
      virtual double Wynagrodznie() { return 1200; };
};

class Dyrektr : public Pracownik { // ta trzecia klasa
      virtual double Wynagrodznie() { return sumaCzego(); }; //suma czego to właściwie
};

Czy tak ma wyglądać struktura tych klas?

0

Struktura jest dobra. To ma być suma wynagrodzeń nauczyciela i woźnego

0

Czy wypłata nauczyciela jest taka sama dla każdego nauczyciela, a wypłata woźnego jest taka sama dla wszystkich woźnych ? Bo jakoś nie widzę sensu dlaczego wynagrodzenie dyrektora powinno być sumą wynagrodzeń Nauczyciela i Woźnego.

0

Dokładnie to wygląda na zły sposób zaprojektowania struktury klas.
Jedyny sposób jaki widzę (co jest trochę bezsensu) to:

class Dyrektor : public Pracownik {
    Pracownik *podwladny1, *odwladny2;
public:
     Dyrektor()
     {
           podwladny1 = new Nauczyciel;
           podwladny2 = new Wozny;
     }
    ~Dyrektor()
    {
        delete podwladny1;
        delete podwladny2;
    }

      virtual double Wynagrodznie() { return 2000; };
      double WynagrodzeniePodwladnych() { return podwladny1->Wynagrodznie()+ podwladny2->Wynagrodznie(); }
};
0

Jeśli się upierasz przy tym aby była to metoda wirtualna, to może zastanów się czy nie podać jej jako parametru kolekcji obiektów, dla których będziesz mógł pobrać Wynagrodzenie. Wtedy do metody Wynagrodzenia w klasie Wozny i Nauczyciel możesz podać null, bo i tak nie jest wykorzystywane, a do metody z klasy Dyrektor podajesz listę obiektów typu Pracownik i tam już możesz je sumować.
Nie wiem czy to o to chodziło, ale ten problem należy rozwiązać przez poprawne zaprojektowanie klas, a nie tak naokoło. ;) Może przedstaw cały problem, wtedy będzie łatwiej coś powiedzieć.

0

hm hm, a to nie jest zawsze tak, że struktura zawsze jest bez sensu ;) Może to jest przykład na przećwiczenie dziedziczenia:

   A
   |
   B
  / \
 C   D
  \ /
   E

takie hierarchie rzadko, ale są:

class Muzyk {
    public: virtual double wyplata() = 0;
    };

class Gitarzysta : public virtual Muzyk {
    public: virtual double wyplata() { return 5; }
    };

class Wokalista : public virtual Muzyk {
    public: virtual double wyplata() { return 10; }
    };

class Rockman : public Wokalista, public Gitarzysta {
    public: virtual double wyplata() {
        return Wokalista::wyplata() + Gitarzysta::wyplata();
        }
    };

to ma sens logiczny - w sensie projektu klas. Po prostu gość robi 2 rzeczy za dwie osoby, dostaje więc kasę odpowiednią.

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0