dziedziczone tworznoe przez new

0

jest tak : mam jakąs tam klase A i klase X klasa X ma funkcje ktora zwraca stworzona klase A .... teraz ja dziedzicze po A tworząc klase Bi dodaje pare nowych zmiennych .. jeśli wyśle ją do stworzenia w kalsie X(a tylko ona wie jak to stworzyc) to stworzy A a nie B .. w takim razie hmm jak dotworzyć klase B ?

0

troche inaczej to wytłumacze : jest klasa abstrakcyjna A
teraz ja poniej dziedicze w B a klasa X tworzy klase A tzn. daje jej wskaźnik do jakiegoś obiektu pochodnego od A i ja chce ta nowo utworzona klase miec u siebie + jakies dane ... coś czuje że nie da rady :/

0

Hej,

rzecz w tym, że jeżeli Twoja klasa X tworzyłaby elementy klasy B, to bez problemu może stworzyć elementy klasy A (a raczej nadawać im wskaźnik na coś tam, jak to jest w Twoim przypadku), pod warunkiem oczywiście, że klasa A będzie zawierała te pola, które są potrzebne w inicjowaniu klasy B.

Nie ważne... w każdym razie obiekt A jest częścią obiektu B, zawiera się w nim. Możesz te same działania robić na obiekcie A, którą są przeznaczone dla B. Natomiast nigdy na odwrót, klasa A nie traktuje klasy B jako części siebie. Potraktuj to tak jakby A nie wiedziało o istnieniu B, natomiast B wie o istnieniu A.

W skrócie: musisz napisać nową metodę dla klasy X, która inicjuje pola klasy B. Przez klasę A to nie przejdzie i tyle.

Jakieś pytania?

0

twoj problem najprosciej rozwiazac za pomoca wzorca fabryki.

W skrocie dziala on tak:
masz klase A i fabryke do nieg X( moze to by inna klasa )( aha i obie te klasy moga byc abstrakcyjne) i teraz dziedzicac po klase A musisz takze stworzyc do niego konkretna fabryke czyli dziedziczyc po klasie X.

Wiecej mozesz poczytac na stronie :
http://www.dofactory.com/Patterns/Patterns.aspx

pozdrawiam
Assassin.

0

problem polega na tym że metoda do tworzenia obiektu A jest juz skompilowana i nie mam o niej pojęcia ....

0

czyli klasy A i X sa skompilowane, i co z tego ?? przeciez jak dziedziczysz to w sumie <ort>nie</ort> obchodiz cie jak dziala klasa ktora dziedziczysz ale interesuje cie tylko to jakie udostepnia ona metody. Wiec po porstu dziedzicz po A a potem dziedzicz po X i dodaj taka funkcjonalnosc jaka potrzenujesz.
Chyba nie rozumiem gdzie masz problem ??

Assassin.

0

moment bo moze faktycznie nie rozumiem ... mam tak:
class X
{
createObject();= po tej funkcji klasa A ma wskaźnik do jakiejs tam klasy

}
class A
{
virtual fun1();
virtual fun 2();
...

}
class B:public A
{
int xxx;
int bbb;

}
class XX:public X
{
CreateObjectB(B){this->X::Createobject(B);}?? i co dalej skoro CreateObject
da mi stworzana klase A a jak mam sam zrobic B to inty potrafie przypisac odpowiednie ale nie wiem jaki dać wskaźnik na reszte funkcji wirtualnych jak mozesz to dopisz kod do CreateObjectB

}

0
  1. Czy możesz dokładnie opisać co robi klasa A i coś dokładniej o X::createObject(), a przede wszystkim co zwraca i jakie ma parametry oraz co robi?

  2. Jeśli A jest abtrakcyjną klasą (być może coś Ci się pomyliło...) to nie można tworzyć jej obiektów, w takim razie wracamy do 1. co robi createObject()? I czy A ma metody wirtualne czy czysto wirtualne (abtrakcyjne)?

  3. Czy nie wystarczy:

class B:public A
{
	int xxx;
	int bbb;

// tak naprawdę po A zostanie odziedziczone zachowanie fun1() i fun2()
// to w czym jest problem???
//	virtual void fun1() { A::fun1(); }
//	virtual void fun2() { A::fun2(); }

};

Klasa B zachowa się wtedy tak samo jak A w fun1() i fun2().
Chyba, że fun1() i fun2() są czysto wirtualne, a Ty nie masz za bardzo pojęcia o polimorfiźmie i dziedziczeniu :/

0

hmm jako takie pojęcie mam postaram sie to inaczje wytłumaczyć klasa createA robi cos takiego
createA(A *a)
{
a=new gg; z tym ze ja o gg nie mam pojecia bo rownie dobrze to moze byc xxx
ta funkcja jest juz skompilowana i nie wiem jaki wskaznik poda do czysto abstrakcyjnej klasy a

}
jesli ja odziedzicze po A i zrobie cos takiego
B *b;
CreateA(b); to ta funkcja zrobi operatorem new cos typu gg czyli jak mniemam moje inty w klasie B nie zostana <ort>w ogóle</ort> utworzeone ....

0

klasa createA robi cos takiego
createA(A *a)
{
a=new gg; z tym ze ja o gg nie mam pojecia bo rownie dobrze to moze byc xxx
ta funkcja jest juz skompilowana i nie wiem jaki wskaznik poda do czysto abstrakcyjnej klasy a
}

[Rozumiem, że metoda createA, a nie klasa...]

jesli ja odziedzicze po A i zrobie cos takiego
B *b;
CreateA(b); to ta funkcja zrobi operatorem new cos typu gg czyli jak mniemam moje inty w klasie B nie zostana <ort>w ogóle</ort> utworzeone ....

No tak, dostając gotowy obiekt z metody createA() nie możesz dorobić do niego innej klasy, nie wiedząc czym tak naprawdę jest ten obiekt. W hierarchi dziedziczenia te klasy będą obok siebie (klasa gg i klasa B wyprowadzone z klasy A).

A teraz zadaj sobie pytanie: po co musisz dodać do obiektu niewiadomej klasy jeszcze coś?? Po co chcesz robić z klasy gg, klasę B??
Cokolwiek myślisz na ten temat wydaje mi się, że popełniasz gdzieś błąd w spojrzeniu na to, co tak naprawdę chcesz zrobić.

Dziedziczenie nie jest zawsze najlepszym rozwiązaniem, a w zasadzie nie jest w ogóle dobrym rozwiązaniem [diabel]

Jeżeli potrzebujesz dodać tylko dwa int to nie lepiej zrobić:

class B
{
    A *a; // cokolwiek z abstrakcji klasy A
    int i1,i2;
public:
    B(X &x) :  i1(100), i2(999)
    { 
        x.createA( a ); 
    }
};

Masz klasę B, która jest rozszerzeniem klasy z abstrakcji A. Oczywiście to jest tylko model, bo tak naprawdę nie wiem jak dokładnie te klasy X,A,B wyglądają; być może będziesz potrzebował innego konstruktora, np. B(A *_a) : a(_a) {...}
i wtedy X x; A *a; x.createA(a); B(a); i dziękujemy :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1