Pobieranie typu klasy

0

Witam. Nawet nie wiem jak to nazwać więc zaraz wyjaśnię

class Klasa1
{
	
	virtual void Wypisz(){};
};


class Klasa2: public Klasa1
{
	
	void Wypisz()
	{
		cout<<"Klasa2!!!";
	}
};

class Klasa3: public Klasa2
{
	void Wypisz()
	{
	cout<<"Klasa3!!!";
	}
};

void Kopiuj (Klasa1 *Wsk, Klasa1 Argument)
{
	Wsk = new //Tutaj chciałbym mieć typ klasy "Argument'u"
};

To było tak w skrócie.

Zastanawiam się czy jest możliwość dynamicznie rozpoznać klasę jaka została podana w argumencie (równie dobrze może to być Klasa1, Klasa2 lub nawet Klasa3) i zaalokować na Wsk ten sam typ klasy.
Próbowałem z bawić się dynamic_cast ale niezbyt mi to wyszło. Brakuje mi pomysłów.

Wiem, że mógłbym z jego pomocą rozpoznać co to za tym klasy i następnie odpowiednimi if'ami wszystko zrobić - ale zabije to cudowną "elastyczność na dodatki" obiektywności. Ktoś bardziej doświadczony da mi być może radę, ładnie proszę? :)
Albo ewentualnie powie, że to niemożliwe xD

1
class Klasa
{
public:
	virtual Klasa* clone() { return new Klasa(*this); }
};

Tak najprosciej utworzyc obiekt, tego samego typu co juz istniejacy.

0

Dziękuję bardzo!

1

Jest sposób nieco bardziej skomplikowany niż to opisał @n0name_l ale za to bardziej uniwersalny.
Polega na stworzeniu mapy typeid klasy -> obiekt klasy wzorcowej potrafiącej skopiować (ewentualnie nie tylko) wskazaną klasę.
Przy czym może to być mapa schowana jako obiekt statyczny w klasie bazowej.
Jeżeli ktoś będzie zainteresowany to opiszę bardziej szczegółowo.

0

Jestem bardzo zainteresowany, więc proszę. Może przykład n0name_l mi wystarczy na moje potrzeby (chcę po prostu przeciążyć operator = ) ale być może uniwersalny - raz napisany sposób będzie lepszy niż łatwy ale pisany wielokrotnie ;P

Mam problem z kodem:

#include <iostream>
using namespace std;

class Klasa1
{
         public:
    	virtual	Klasa1* clone() 
		{
			return new Klasa1(*this); 
		};
        
	virtual void Wypisz()
	{
		cout<<"Klasa1!!!";
	};
};


class Klasa2: public Klasa1
{
	public:
	Klasa1* clone()
	{
		return new Klasa2(*this);
	};
	
	void Wypisz()
	{
		cout<<"Klasa2!!!";
	}
};

class Klasa3: public Klasa2
{
	public:
	Klasa1* clone() 
	{
		return new Klasa3(*this); 
	};
	
	void Wypisz()
	{
		cout<<"Klasa3!!!";
	}
};

void Kopiuj (Klasa1 **Wsk, Klasa1 Klasa)
{
	*Wsk = Klasa.clone();
};

int main()
{
	Klasa1 *Wsk1;
	Klasa2 A;
	
	Klasa1 *Wsk2;
	Klasa2 B;
	
	Wsk1 = A.clone();
	Wsk1->Wypisz();
	cout<<endl;
	
	Kopiuj(&Wsk2,B);
	Wsk2->Wypisz();
	return 0;
} 

Wyświetli "Klasa 2
Klasa1"
Rozumiem, że z powodu, iż argumentem jest klasa1 program sięga do funkcji w klasie klasa1 a nie odpowiedniej wirtualnej (zawiodłem się :\ )
Chciałbym móc rozwiązać to w funkcji. Znów brakuje mi pomysłów. Nie lubię obiektowości xP

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