Body zdarma Java týden
Využij podzimních slev a získej od nás až 40 % bodů zdarma! Více zde
Pouze tento týden sleva až 80 % na Java e-learning!

Diskuze: Problem pri dedicnosti v C++

Aktivity (2)
Avatar
Philip Recek
Člen
Avatar
Philip Recek:12. dubna 18:03

Zdravim. Takze mam nejaku zakladnu triedu a potom triedu od nej odvodenu (napr. zviera a pes).
Vytvoril som ukazovatela na zakladnu triedu ktoremu som priradil objekt odvodenej triedy (pes).
Trieda pes ma oproti triede zviera o jednu funkciu naviac (napr. stekanie). Tu nastava problem pretoze metodu (stekanie) nebude mozne zavolat pomocou (vyssie spomenuteho) ukazovatela.

Zkusil jsem: Mojim riesenim bolo vytvorit v zakladnej triede (zviera) virtualnu funkciu (stekanie). Potom by som sa mohol pomocou ukazovatela k tej funkcii dostat.

Chci docílit: Mojou otazkou je ci toto je spravne riesenie ako taku situaciu riesit. Problem je to ze potom ma trieda zviera jednu metodu naviac (stekanie) ktora bude prazdna (nemozem z nej urobit cistu virtualnu metodu pretoze potom by sa z triedy zviera stal abstraktny typ a to nechcem).

Dufam ze som to napisal dost zrozumitelne :D
Dakujem za kazdu radu

Editováno 12. dubna 18:06
 
Odpovědět 12. dubna 18:03
Avatar
Martin Šlachta
Redaktor
Avatar
Odpovídá na Philip Recek
Martin Šlachta:12. dubna 19:54

Ahoj,

jestli tomu rozumím dobře, tak můžeš udělat abstraktní metodu, řekněme "zvuk()" a pak ve tříde Pes definovat tuto metodu jako 'override' a přes ten volat metodu "haf()". Např.

class Zvire {
        virtual void zvuk() = 0;
};

class Pes : public Zvire {
        void zvuk() override {
                std::cout << "Haf"; // Specificka akce pro psa
        }
};

Snad jsem to teď já napsal srozumitelně :D z praxe vím že mi to moc nejde :D

Editováno 12. dubna 19:55
 
Nahoru Odpovědět  +1 12. dubna 19:54
Avatar
Philip Recek
Člen
Avatar
Philip Recek:12. dubna 20:18

Aha, ale nestane sa z triedy zviera teraz abstraktny typ? Ide o to ze vytvaram aj objekty typu zviera a to sa nebude dat ak bude zviera abstraktny typ. S klucovym slovom override som sa este nestretol takze to mozno nechapem uplne spravne :D.

Editováno 12. dubna 20:20
 
Nahoru Odpovědět 12. dubna 20:18
Tento výukový obsah pomáhají rozvíjet následující firmy, které dost možná hledají právě tebe!
Avatar
Jirka
Člen
Avatar
Odpovídá na Philip Recek
Jirka:12. dubna 21:04

Ahoj.

Možná nějak takto:

class Zvire {
        virtual void zvuk() = 0;
};

class Pes : public Zvire {
        virtual void zvuk()  {
                std::cout << "Haf"; // Specificka akce pro psa
        }
};
Nahoru Odpovědět 12. dubna 21:04
Kdo nic nedělá, nic nezkazí.
Avatar
Martin Šlachta
Redaktor
Avatar
Odpovídá na Philip Recek
Martin Šlachta:12. dubna 22:44

No, bude, ale čemu to vadí, jesti tam nepřidáš žádnou jinou funkci/promněnou, tak není potřeba mít instanci čistě třídy "Zvire". Stačí mít pointer třídy "Zvire", která bude ukazovat na již rezervovanou pamět pro řekněme "Pes". Jinými slovy :

int main() {
        Zvire* zvire; // Vytvori pointer, nic neznamena, proste jen ukazuje na misto v pameti.
        Pes pes = Pes(); // Vytvori instanci psa a rezervuje mu misto v pameti
        // zvire->zvuk(); Error, protoze zvire neukazuje na platne uvolnene misto

        zvire = &pes; // Nyni muze pointer typu Zvire ukazovat na instanci psa, takze uz ukazuje na platne misto
        zvire->zvuk(); // Ted muzeme vesele stekat

        Kocka kocka = Kocka();
        zvire = &kocka; // Muzeme ukazat prakticky kamkoli, ale jen pokud typ dedi ze "Zvire" tak nedostaneme error.
}

Jinak override prostě přepíše definici funkce z base třídy. Např.

class Base {
        // Vytvorime-li nyni instanci "Base" a zavolame funkci "funkce()", ozve se "Base trida"
        void funkce() {
                std::cout << "Base trida";
        }
};

class Derived {
        // Vytvorime-li nyni instanci "Derived" a zavolame funkci "funkce()", ozve se "Derived trida"
        void funkce() override {
                std::cout << "Derived trida";
        };
};
Akceptované řešení
+20 Zkušeností
+1 bodů
Řešení problému
 
Nahoru Odpovědět  +1 12. dubna 22:44
Avatar
Borek
Člen
Avatar
Odpovídá na Martin Šlachta
Borek:29. července 8:29

Pokud napíšeš Pes pes = Pes(), tak to alokuješ dočasný objekt na zásobníku, který kopíruješ kopy - konstruktorem do druhého objektu na zásobníku v proměnné pes. Proč nestačí Pes pes() nebo Pes pes; ? Zvyk z jiného jazyka v definici přidat rovnítko ?

 
Nahoru Odpovědět 29. července 8:29
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 6 zpráv z 6.