» »

[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.

/******* 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?

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.

Vesoljc ::

virtual?

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...

Spura ::

Use composition.


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

Iščem program c++

Oddelek: Programiranje
6858 (726) krneki0001
»

C++ prevajalnik

Oddelek: Programiranje
81543 (1366) Jean-Paul
»

[c++] standardni c++ in dogodki(events)

Oddelek: Programiranje
121749 (1574) yeti
»

[c++] extern "C"; error 2598

Oddelek: Programiranje
51040 (973) TheCyborg
»

[C++] Thinking in C++

Oddelek: Programiranje
101119 (984) rozha

Več podobnih tem