|
Informatyka UJ forum Rocznik 2005 - czyli najlepsze forum w sieci
|
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
|
Wysł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 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
|
Wysł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 poprzedni temat :: Zobacz następny temat |
Autor |
Wiadomość |
Stefan
pijak
Dołączył: 22 Lis 2005
Posty: 173
Przeczytał: 0 tematów
|
Wysł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 |
|
|
|
|
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
|