Forum » Programiranje » [C++] dostopanje do child-objekta iz parent-objekta
[C++] dostopanje do child-objekta iz parent-objekta
zorangutan ::
Pozdrav,
imam razred derived in razred base. Iz base-razreda bi rad klical funkcije razreda derived. To sem uredil tako, da se base classu poda pointer na derived class.
Tak dizajn sem izbral zato, ker bi rad razred CDerived izpopolnil s funkcionalnostimi razreda CBase, ki bi jih ločeno programiral v tem CBase razredu, brez da spreminjam razred CDerived. To potrebujem zato, ker lahko hkrati kličem originalno funkcijo in "razširjeno" funkcijo (ki v sebi kliče tudi originalno, poleg tega pa dela še stvari, ki bi jih rad imel ločene).
Zanima me, če tak dizajn vsebuje kakšne nevarnosti in ali lahko vodi do kakšnih problemov? Ali obstaja kakšna bolj elegantna rešitev?
imam razred derived in razred base. Iz base-razreda bi rad klical funkcije razreda derived. To sem uredil tako, da se base classu poda pointer na derived class.
/******* CBase.h *******/ class CDerived; class CBase { CBase( CDerived* d ) { this->d = d; } void func1(); private: CDerived* d; } /******* CBase.cpp *******/ #include <CDerived.h> CBase::func1() { // dela še neke druge stvari, nepovezane z razredom CDerived // hkrati pa potrebuje dostop do funkcij CDerived d->func_derived(); } /******* CDerived.h *******/ class CDerived : public CBase { CDerived(), CBase(this) {}; void func_derived(); } /******* main.cpp *******/ CDerived *derived = new CDerived(); derived->func1(); // razširjena funkcija func_derived derived->func_derived(); // originalna funkcija
Tak dizajn sem izbral zato, ker bi rad razred CDerived izpopolnil s funkcionalnostimi razreda CBase, ki bi jih ločeno programiral v tem CBase razredu, brez da spreminjam razred CDerived. To potrebujem zato, ker lahko hkrati kličem originalno funkcijo in "razširjeno" funkcijo (ki v sebi kliče tudi originalno, poleg tega pa dela še stvari, ki bi jih rad imel ločene).
Zanima me, če tak dizajn vsebuje kakšne nevarnosti in ali lahko vodi do kakšnih problemov? Ali obstaja kakšna bolj elegantna rešitev?
- spremenilo: zorangutan ()
darkkk ::
Očitno neki delaš narobe.
Če gre za "Can I" problem, pol ja, marsikaj lahko zmutiš v c++, ampak bere se pa ravno tako, kot da želiš razbiti vse, čemur je dedovanje (in OOP ) namenjen. Drgač elegantno, castaš base v potomca in se izvede metoda potomca. Vprašanje pa je, čemu to početi. Ideja objektov je, da izvajajo "lastne" metode.
Če gre za "Can I" problem, pol ja, marsikaj lahko zmutiš v c++, ampak bere se pa ravno tako, kot da želiš razbiti vse, čemur je dedovanje (in OOP ) namenjen. Drgač elegantno, castaš base v potomca in se izvede metoda potomca. Vprašanje pa je, čemu to početi. Ideja objektov je, da izvajajo "lastne" metode.
Vesoljc ::
virtual?
psuedo code below, may include horrific errors...
psuedo code below, may include horrific errors...
class A { virtual void func() { // A stuff } }; class B: public A { void func() { A::func(); // B stuff } }; A *a = new A; B *b = new B; a->func(); // A b->func(); // A + B A *c = (A*)b; c->func(); // A
Abnormal behavior of abnormal brain makes me normal...
mallard ::
To je čist mimo...
Če rabiš polimorfizem, imej v staršu virtualne metode, ki naj jih izpeljan razred po želji povozi, če rabi drugačno funkcionalnost (še zmeraj pa lahko kliče metodo starševskega razreda, če je to potrebno). To, da CBase dela nekaj nepovezanega s CDerived, najbrž pomeni, da vsiljuješ dedovanje nekam, kjer to ni potrebno. Uporabi kompozicijo...
Če rabiš polimorfizem, imej v staršu virtualne metode, ki naj jih izpeljan razred po želji povozi, če rabi drugačno funkcionalnost (še zmeraj pa lahko kliče metodo starševskega razreda, če je to potrebno). To, da CBase dela nekaj nepovezanega s CDerived, najbrž pomeni, da vsiljuješ dedovanje nekam, kjer to ni potrebno. Uporabi kompozicijo...
Vredno ogleda ...
Tema | Ogledi | Zadnje sporočilo | |
---|---|---|---|
Tema | Ogledi | Zadnje sporočilo | |
» | Iščem program c++Oddelek: Programiranje | 863 (731) | krneki0001 |
» | C++ prevajalnikOddelek: Programiranje | 1555 (1378) | Jean-Paul |
» | [c++] standardni c++ in dogodki(events)Oddelek: Programiranje | 1759 (1584) | yeti |
» | [c++] extern "C"; error 2598Oddelek: Programiranje | 1052 (985) | TheCyborg |
» | [C++] Thinking in C++Oddelek: Programiranje | 1127 (992) | rozha |