IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze: Problem pri dedicnosti v C++

Aktivity
Avatar
Philip Recek
Člen
Avatar
Philip Recek:12.4.2019 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.4.2019 18:06
 
Odpovědět
12.4.2019 18:03
Avatar
Martin Šlachta
Tvůrce
Avatar
Odpovídá na Philip Recek
Martin Šlachta:12.4.2019 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.4.2019 19:55
 
Nahoru Odpovědět
12.4.2019 19:54
Avatar
Philip Recek
Člen
Avatar
Philip Recek:12.4.2019 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.4.2019 20:20
 
Nahoru Odpovědět
12.4.2019 20:18
Avatar
Jirka
Člen
Avatar
Odpovídá na Philip Recek
Jirka:12.4.2019 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.4.2019 21:04
Kdo nic nedělá, nic nezkazí.
Avatar
Martin Šlachta
Tvůrce
Avatar
Odpovídá na Philip Recek
Martin Šlachta:12.4.2019 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í
+2,50 Kč
Řešení problému
 
Nahoru Odpovědět
12.4.2019 22:44
Avatar
Borek
Člen
Avatar
Odpovídá na Martin Šlachta
Borek:29.7.2019 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.7.2019 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.