Referencja do klasy pochodnej z klasy abstrakcyjnej

0

Mam szablon klasy abstrakcyjnej i w niej metodę która będzie taka sama dla wszystkich klas pochodnych. Ma zwracać referencję do siebie samej po zmianach.

template<typename T>
class AbstractBase
{
public:
    Derived<T>& resize(T first, T last);
};
Derived<T>& resize(T first, T last) {
        // tutaj zmieniam wartości w klasie
        return dynamic_cast<Derived<T>&>(*this);
    }

Czy jest lepsze rozwiązanie?

3

Przy poliformiźmie statycznym, dlaczego nie static_cast?

0

Może być static, chodzi tylko o to czy można to zrobić lepiej? Bez rzutowania? Bo takich metod w klasie abstrakcyjnej byłoby dużo więcej gdzie muszą być zwracane referencje do "samej siebie" ale nie klasy abstrakcyjnej a już konkretnej pochodnej.

3

Nie da się bez jawnego rzutowania. W końcu to inne typy, a docelowy jest niżej w hierarchii dziedziczenia

0

Czym jest Derived? Jak wygląda deklaracja tej klasy? Może coś przeoczyłem, ale jakoś to rzutowanie dziwnie wygląda.

0

Ewentualnie wprowadzać te metody dopiero w klasach pochodnych ale nie po to tworze klasę abstrakcyjną.
Ok, dzięki Ci bardzo.

0

Bardzo prosto,

template<typename T>
class Derived : public AbstractBase<T>
{
};
0

To rozwiązanie łamie zasadę Open/close z SOLIDu.
Klasa bazowa nie powinna znać swoich klas pochodnych. Nie wiem, jak udałoby Ci się w ogóle coś takiego skompilować, bo zapis:

 
template<typename T>
class AbstractBase
{
public:
    Derived<T>& resize(T first, T last);
};

wymaga deklaracji wyprzedzającej dla klasy Derived, a ta dla szablonu nie jest możliwa.

W powyższej deklaracji AbstractBase brakuje **virtual ** przy deklaracji resize. Czemu nie zrobisz czegoś takiego?

 
template<typename T>
class AbstractBase
{
public:
    virtual AbstractBase<T>& resize(T first, T last) = 0;
};

...

template<typename T>
class Derived : public AbstractBase<T>
{
public:
    AbstractBase<T>& resize(T first, T last)
    {
...
        return (*this);
        //return dynamic_cast<Derived<T>&>(*this);
    }
};
0

Gutek daj żyć chłopie xd
Po 1 nie łamie żadnej zasady a po 2 pokazałem tylko fragmenty kodu więc kod się kompiluje bo można mieć i mam deklarację wyprzedzajacą dla Derived.

0

No to teraz odziedziczcie kolejne klasy po Base<T>...

Jesli tam mialby byc polimorfizm statyczny, to Derived dziedziczy po Base<Derived>, a nie po Base<T>

1

Nie rozumiem Twojego problemu @GutekSan. Dziedziczenie odbywa się bezproblemowo.

0

@GutekSan takie dziedziczenie to tylko jedna z możliwych implementacji. Czasami jednak masz template <typename T> class derived : base<T> i jest to jak najbardziej poprawny statyczny polimorfizm. Wklejam raz jeszcze:
http://melpon.org/wandbox/permlink/PQq6DzQ57E05cCel

0

Szczur pisał o "wszystkich klasach pochodnych". Założyłem więc, że

 
template<typename T>
class Derived : public Base<T>

nie jest jedyną klasą pochodną, ale mogą być jeszcze Derived2, Derived3, ...
Wówczas deklaracja AbstractBase wymagałaby modyfikacji.

0

W takim razie być może moja wina i nie wyraziłem się jasno, chodziło mi o wszystkie specjalizacje klasy Derived tak jak mówi @kq

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