Dziedziczenie - funkcja zwracająca różne typy.

0

Pseudo kod:

iKlasa
{};

KlasaInt : iKlasa
{
 KlasaInt(int i);
 int get();
};

KlasaFloat : iKlasa
{
 KlasaFloat(float f);
 float get();
};

Zależnie od tego którego potomka przypiszę do zmiennej typu iKlasa, za pomocą funkcji get() chcę otrzymać odpowiedni typ zmiennej:

iKlasa *klasaI = new KlasaInt(6);
iKlasa *klasaF = new KlasaFloat(7.2);

int i = klasaI->get();
float f = klasaF->get();

Jak powinna wyglądać funkcja iKlasa::get()?

0

Słowa kluczowe: polimorfizm, funkcje wirtualne

0

Dokładniejszym słowem będzie "dynamic_cast" - pozwala na rzutowanie obiektów klasy podstawowej na obiekty klasy potomnej.

Jak tutaj zastosować funkcję wirtualną to nie wiem bo w klasach potomnych get() zwracają inny typ.

0

Rzeczywiście, mój błąd. Właśnie patrzyłem jak to z dynamic_cast, ale nie wyszło od razu, a w pracy siedzę. Może później pokombinuje

0

iKlasa nie musi mieć metody get()
Chcąc użyć metody klasy pochodnej urzywamy dynamic_cast.
Pseudo kod:

iKlasa *klasaI = new KlasaInt(6);
iKlasa *klasaF = new KlasaFloat(7.2);

int i = (dynamic_cast<KlasaInt*>( klasaI ))->get();
float f = (dynamic_cast<KlasaFloat*>( klasaF ))->get();
0

Jak klasy mają się typem różnić, przydałby się template:

#include <iostream>
using namespace std;

template <typename T>
class Klasa
{
 private:
   T field;
 public:
   Klasa(T i) { field = i; }
   T get() { return field; }
};

int main()
{
  Klasa<int> *klasaI = new Klasa<int>(6);
  Klasa<float> *klasaF = new Klasa<float>(7.2);

  int i = klasaI->get();
  float f = klasaF->get(); 

  cout<<i<<endl;
  cout<<f<<endl;
}
0

Chodzi o to że do jednej funkcji chcę przekazać iKlasa która tak naprawdę przekazuje obiekt KlasaInt lub KlasaFloat. Template jest fajny ale zrobi duże zamieszanie.

Inny przykład: iKlasa ma klasy potomne MySQL i PortageSQL które to przenoszą obiekt danego połączenia. Obiekty są tworzone przez fabrykę ( iKlasa::fact("m") i iKlasa::fact("p") ) użytkownik nie musi się zagłębiać w szczegóły działania poszczególnych połączeń.
Funkcja getData( iKlasa ) ma sobie znaleźć jakie połączenie jest używane i pobrać dane wykorzystując odpowiednie zapytania.

Za pomocą dynamic_cast w getData dobieram się do odpowiedniego połączenia.

Troszkę tłumaczenia by było dla tego podałem takie proste przykłady.
Problem został rozwiązany, dzięki za pomoc.

0

Może napisz, jak sobie poradziłeś?

0
sharkos napisał(a)

iKlasa nie musi mieć metody get()
Chcąc użyć metody klasy pochodnej urzywamy dynamic_cast.
Pseudo kod:

iKlasa *klasaI = new KlasaInt(6);
iKlasa *klasaF = new KlasaFloat(7.2);

int i = (dynamic_cast<KlasaInt*>( klasaI ))->get();
float f = (dynamic_cast<KlasaFloat*>( klasaF ))->get();

Cztery posty wyżej napisałem.

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