Funkcje wirtualne od-definiowanie funkcji

Funkcje wirtualne od-definiowanie funkcji
P9
  • Rejestracja:prawie 11 lat
  • Ostatnio:ponad 10 lat
  • Postów:18
0

Witam,
Otóż mam pytanie w jaki sposób radzicie sobie w takiej sytuacji:

Mam klase abstrakcyjna ktora nazwałem Obiekt. Mam wiele obiektów dziedziczacych po klasie Obiekt, ale nagle okazuje się, że np. w jednej klasie Beczka funkcja obroc, ma po prostu nie isnieć/ nigdy się nie wykonywać.

Kopiuj
class Obiekt
{
public:

virtual void obroc() = 0;

//wiele innych funkcji wirtualnych i nie wirtualnych
};

class Beczka : public Obiekt
{
public:
void obroc() { //kod}
}
 

Do tej pory ten problem rozwiązywałem po prostu zostawiając tą funkcje pusta

void Beczka::obroc()
{
//pusta
}

Ale jestem ciekawy czy istnieje jakis sposób aby usunąć konieczność definiowania tej funkcji aby program się kompilował

Dzieki

spartanPAGE
  • Rejestracja:prawie 12 lat
  • Ostatnio:około miesiąc
1
Kopiuj
class Object{
    virtual void method(){};
};

Niech funkcja nie będzie czysto wirtualna.

edytowany 1x, ostatnio: spartanPAGE
satirev
  • Rejestracja:prawie 14 lat
  • Ostatnio:około 4 lata
0

Najlepiej przygotuj domyślną implementację metody czysto wirtualnej (nie rezygnuj z metody czysto wirtualnej), a w klasie pochodnej przenieś tę metodę do części prywatnej.

Kopiuj
 
class Obiekt
{
public:
  virtual void obroc() = 0;
};

void Obiekt::obroc() {}
 
class Beczka : public Obiekt
{
private:
  void obroc() override { Obiekt::obroc(); }
};
 
int main() {
  Beczka b;
  return 0;
}
spartanPAGE
w ten super sposób otrzymujemy nic w kilku linijkach więcej, hurra
satirev
lol, w ten sposób zapewniamy pure virtual dla klasy bazowej + ewentualnie przygotowujemy domyślną implementację danej metody
twonek
Ale czysto wirtualna znaczy, że klasa pochodna powinna ją sensownie przedefiniować. Jak nie chce/może, to znaczy że pierwotny sens bycia czysto jest błędny.
satirev
"w jednej klasie Beczka funkcja obroc, ma po prostu nie isnieć/ nigdy się nie wykonywać" - nauka czytania ze zrozumieniem.
twonek
To znaczy że Beczka nie spełnia wymagań bycia klasą pochodną klasy Obiekt. Więc albo zmieniamy wymagania, albo tworzymy bezsensowne puste funkcje.
satirev
Przeniesienie tej metody do części prywatnej pozwala ją ukryć przed dostępem publicznym. Nikt nie tworzy bezsensownych metod, tylko często metoda czysto wirtualna może implementować podstawową logikę, którą warto wykorzystać w klasach pochodnych i za razem pozostawić klasę bazową, jako abstrakcyjną. Bezsensem jest natomiast definiowanie (tylko) metody wirtualnej (zamiast czysto wirtualnej) w klasie, która nie powinna pozwalać na generowanie instancji. Jeśli tego nie rozumiecie to dalsza rozmowa nie ma sensu ;)
twonek
Bez sensu jest dyskusja z kimś, kto ciągle stara się udowodnić, że jego rozmówcy są idiotami ;)
satirev
Nigdzie nie wysnułem takiego wniosku
spartanPAGE
[...]która nie powinna pozwalać na generowanie instancji http://ideone.com/KH2W5Z mów mi jeszcze. W tym wszystkim pamiętaj o wygodzie użycia.
satirev
@spartanPAGE, odnośnie destruktora czysto wirtualnego to mea culpa, przyznaję rację ;) Co do wygody użycia to się nie zgadzam ale to już kwestia bardziej indywidualna.
tajny_agent
To trochę tak jakby autobus dziedziczył po samolocie ( mają kółka i wożą ludzi ), ale ukrywał metodę "leć()". Moim zdaniem jest to błąd projektowy, chyba, że ktoś zarzuci praktyczny przykład takiej sytuacji ;) Twonek dał chyba najlepszą odpowiedź. Skoro n klas dziedziczy z klasy Y to oczekuję, że będę mógł użyć wszystkich tych metod w klasach pochodnych.Bez kombinowania z ukrywaniem tego czy tamego.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.