Forum Informatyka UJ forum Strona Główna Informatyka UJ forum
Rocznik 2005 - czyli najlepsze forum w sieci
 
 FAQFAQ   SzukajSzukaj   UżytkownicyUżytkownicy   GrupyGrupy   GalerieGalerie   RejestracjaRejestracja 
 ProfilProfil   Zaloguj się, by sprawdzić wiadomościZaloguj się, by sprawdzić wiadomości   ZalogujZaloguj 

[C++]Dziedziczenie szablonow

 
Napisz nowy temat   Odpowiedz do tematu    Forum Informatyka UJ forum Strona Główna -> Archiwum / 1 rok / 2 i 3 semestr - Programowanie
Zobacz poprzedni temat :: Zobacz następny temat  
Autor Wiadomość
krzycho
pijak



Dołączył: 09 Lis 2005
Posty: 151
Przeczytał: 0 tematów

Skąd: Radom

PostWysłany: Nie 21:45, 12 Lis 2006    Temat postu: [C++]Dziedziczenie szablonow

Wiecie moze czy w ogle jest mozliwe zrobinie szablonu klasy abstrakcyjnej np. Lista , a pozniej utworzenie szablonu ListaWiazana (dziedziczacego po szablonie "List")? A jesli tak, to jak sie robi takie rzeczy?
Powrót do góry
Zobacz profil autora
Zobacz poprzedni temat :: Zobacz następny temat  
Autor Wiadomość
Fen
zielony żul



Dołączył: 22 Lut 2006
Posty: 946
Przeczytał: 0 tematów

Skąd: Bochnia

PostWysłany: Pon 0:53, 13 Lis 2006    Temat postu:

jeśli się nie mylę to można zrobić coś takiego:

Kod:
 template <class T>
class Lista {
    protected:
        T var;
};

template <class T>
class ListaLepsza : public Lista<T> {
    public:
        void DoSth() {  }
};


głównie chodzi o to aby zawsze pamiętać o napisaniu klasa <typ> tam gdzie używamy odniesień do klasy bazowej
Powrót do góry
Zobacz profil autora
Zobacz poprzedni temat :: Zobacz następny temat  
Autor Wiadomość
Stefan
pijak



Dołączył: 22 Lis 2005
Posty: 173
Przeczytał: 0 tematów


PostWysłany: Pon 12:08, 13 Lis 2006    Temat postu: Re: [C++]Dziedziczenie szablonow

alibaba napisał:
Wiecie moze czy w ogle jest mozliwe zrobinie szablonu klasy abstrakcyjnej np. Lista , a pozniej utworzenie szablonu ListaWiazana (dziedziczacego po szablonie "List")? A jesli tak, to jak sie robi takie rzeczy?


Można:

Kod:
#include <iostream>
#include <iomanip>
using namespace std;

template<typename T>
class AbstractList
{
   public:
      virtual bool isEmpty() const = 0;
      virtual ~AbstractList() { }
};

template<typename T>
class MyList : public AbstractList<T>
{
   public:
      virtual bool isEmpty() const
      {
         return true;
      }
};

int main()
{
   AbstractList<int>* al = new MyList<int>;
   cout << boolalpha << al->isEmpty() << endl;
   delete al;
}



Jeśli tworzysz hierarchię dziedziczenia tylko po to, by utworzyć różne implementacje listy, to polecam rozważyć możliwość użycia polimorfizmu statycznego:
Kod:
#include <iostream>
#include <iomanip>
using namespace std;

struct DefaultListImpl { };
struct OtherListImpl { };

template<typename T, typename ImplementationT = DefaultListImpl>
class List { };

template<typename T>
class List<T, DefaultListImpl>
{
   public:
      void sayHello() const
      {
         cout << "List<T, DefaultListImpl>::sayHello()" << endl;
      }
};

template<typename T>
class List<T, OtherListImpl>
{
   public:
      void sayHello() const
      {
         cout << "List<T, OtherListImpl>::sayHello()" << endl;
      }
};

template<typename T, typename ImplT>
void fun(const List<T, ImplT>& list)
{
   list.sayHello();
}

int main()
{
   List<int> l1;
   List<double, OtherListImpl> l2;
   fun(l1);
   fun(l2);
}



W przyszłej wersji Standardu C++ najprawdopodobniej będą tzw concepty, czyli specjalna konstrukcja do wyrażenia założeń jakie nakłada się na parametry szablonów. Np funkcja fun() mogłaby nakładać wymóg posiadania funkcji sayHello() - czyli byłby to statyczny odpowiednik czysto wirtualnych funkcji. Oczywiście funkcja fun() i tak wymaga, by lista danego typu miała funkcję sayHello(), ale gdy kod się rozrasta, diagnostyka takich błędów staje się trudna.
Powrót do góry
Zobacz profil autora
Wyświetl posty z ostatnich:   
Napisz nowy temat   Odpowiedz do tematu    Forum Informatyka UJ forum Strona Główna -> Archiwum / 1 rok / 2 i 3 semestr - Programowanie Wszystkie czasy w strefie EET (Europa)
Strona 1 z 1

 
Skocz do:  
Nie możesz pisać nowych tematów
Nie możesz odpowiadać w tematach
Nie możesz zmieniać swoich postów
Nie możesz usuwać swoich postów
Nie możesz głosować w ankietach

fora.pl - załóż własne forum dyskusyjne za darmo
Powered by phpBB © 2001, 2005 phpBB Group
Regulamin