Klasy abstrakcyjne a dziedziczenie - problem

0

Mam taki program i taki błąd. Proste pytanie - jak to naprawić?
Zależy mi na zachowaniu tej właśnie hierarchii klas.

#include <iostream>

int stawka;

class Trudnosci
{
    public:
        virtual void Modyfikator() = 0;
};
class Easy : public Trudnosci
{
    public:
    void Modyfikator(){int stawka=100;}
};

class Medium : public Trudnosci
{
    public:
    void Modyfikator(){int stawka=500;}
};

class Hard : public Trudnosci
{
    public:
    void Modyfikator(){int stawka=1000;}
};

class inna_klasa : public Trudnosci
{
    public:
    inna_klasa(){
        Easy easy;
        easy.Modyfikator();
        std::cout<<stawka;
    }
};


int main()
{
    inna_klasa test;
    system("PAUSE");
}

//TREŚĆ BŁĘDU:
//41 C:\Users\Szakal\Desktop\projekt cpp\Untitle2323d1.cpp cannot declare variable `test' to be of type `inna_klasa' 
//41 C:\Users\Szakal\Desktop\projekt cpp\Untitle2323d1.cpp   because the following virtual functions are abstract: 
0

Musisz zdefiniować funkcję Modyfikator(), nie można utworzyć obiektu klasy abstrakcyjnej.

0
Endrju napisał(a):

Musisz zdefiniować funkcję Modyfikator(), nie można utworzyć obiektu klasy abstrakcyjnej.

Czyli dać po prostu void Modyfikator(); No wtedy działa, ale czy to nadal jest klasa abstrakcyjna?
Tzn mam warunek który musi być zawarty w programie tj. "dziedziczenie z klasy abstrakcyjnej", ten kod nadal spełnia ten warunek? (Nie znam się na tym za bardzo ^^)

0

przynajmniej tak:
void Modyfikator() {}

0

Jeżeli tylko takie coś dodasz do inna_klasa to program się skompiluje. Jednak odwołanie do funkcji Modyfikator na obiekcie inna_klasa bądź na wskaźniku do klasy Trudnosci, który wskazuje na obiekt inna_klasa skończy się błędem linkera.

Dlaczego nie chcesz dodać definicji? Skoro ta metoda nie pasuje do tej klasy to po co Ci dziedziczenie?

Jeżeli dodasz puste ciało, tak jak radzi kolega wyżej, wszystko będzie ok. Pozostaje jednak to samo pytanie: po co Ci taka metoda.

0

No to zmieniłem już na tą podaną @2UP

A potrzebuje to, jak już pisałem aby spełnić warunek

"dziedziczenie z klasy abstrakcyjnej"
w moim większym programie, sama metoda ma zmieniać parametry na trzy sposoby w zależności od tego jaki sobie wybiorę. Oczywiście, mogłem zrobić to case'ami ifami itp. Ale potrzebuje spełnić ten warunek.

0

Czy nie prościej by było odziedziczyć:
class inna_klasa : public Easy
?
Tak a propos możesz dać coś w tym stylu:

ExceptionNoWay {};
void modifikator() { throw ExceptionNoWay(); }
0
_13th_Dragon napisał(a):

Czy nie prościej by było odziedziczyć:
class inna_klasa : public Easy
?

No tak, ale nie wydaje mi się żeby to spełniało ten mój warunek??? Czy może spełnia? :D

_13th_Dragon napisał(a):

Tak a propos możesz dać coś w tym stylu:

ExceptionNoWay {};
void modifikator() { throw ExceptionNoWay(); }

Wyjątkami planuję się zająć później, jak starczy mi czasu, o nich na tą chwilę praktycznie nic nie wiem.

0
Isumi napisał(a):

No tak, ale nie wydaje mi się żeby to spełniało ten mój warunek??? Czy może spełnia? :D

Nadal to jest dziedziczenie po klasie abstrakcyjnej (owszem nie bezpośrednie).

0

Dobra, tyle mi raczej starczy.
Wielkie dzięki za szybką pomoc.

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