Diskuze: Problem pri dedicnosti v C++
V předchozím kvízu, Online test znalostí C++, jsme si ověřili nabyté zkušenosti z kurzu.

Člen

Zobrazeno 6 zpráv z 6.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Online test znalostí C++, jsme si ověřili nabyté zkušenosti z kurzu.
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ě z praxe vím že mi to moc nejde
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 .
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
}
};
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";
};
};
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 ?
Zobrazeno 6 zpráv z 6.