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;
}
Zobacz pozostałe 6 komentarzy
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.