W C++ konstruktor domyślny jest generowany automatycznie, jeśli w klasie nie zostanie zdefiniowany żaden inny. W przeciwnym wypadku nie jst on tworzony, co może prowadzić do sytuacji, gdy klasa posiada jedynie takie konstruktory, które wymagają podania parametrów. Jest ona niekorzystna przynajmniej z dwóch powodów:
Kiedy jednak zmieni się postać konstruktora klasy bazowej, wówczas modyfikacja będzie musiała dotyczyć wszystkich bezpośrednich potomków tej klasy. W nowej wersji standardu C++ ma być aczkolwiek wprowadzone nowe zadanie dla słowa kluczowego using
, które pozwoli na automatyczne utworzenie konstruktorów “przekaźnikowych” – takich, których jedyną rolą jest wywołanie konstuktorów bazowych z takimi samymi parametrami jak te otrzymane w konstruktorze pochodnym. Jeśli jednak przy okazji chcemy coś zmienić czy pominąć, to nie ma rady: trzeba całą tę “sztafetę” zakodować ręcznie.
Dlatego też klasy będące przede wszystkim klasami bazowymi w dziedziczeniu dobrze jest wyposażać w konstruktory bezparametrowe. Może to aczkolwiek wymagać wyróżnienia w obiekcie stanów Zainicjowany-Niezainicjowany, które powinny być sprawdzane w jego metodach i w razie potrzeby odpowiednio sygnalizowane.
Cykle w dziedziczeniu klas? Raczej nie. Co najwyżej złączenia gałęzi. Wtedy faktycznie to już nie jest drzewo, tylko dag (Directed Acyclic Graph).
Heh cykl przy dziedziczeniu –
Class A;
Class B public: A
{…};
Class A public: B
{…};
– to całkiem ciekawy pomysł, jeśli dałoby się to skompilować, to próba utworzenia obiektu A lub B powodowałaby nieskończoną rekurencję :D
class A;
class B : public A{};
class A : public B{};
“base class ‘A’ has incomplete type”
Albo nie działa, albo mi sie myslenie już dziś wyłączyło ;)
Faktycznie zasadniczo chodziło mi właśnie o złączenie gałęzi, które w grafie skierowanym (a takimi są grafy dziedziczenia) cyklem oczywiście nie jest. Przepraszam za zamieszanie :)
@lukaszw: nie wylaczylo. Jesli dobrze pamietam to do dziedziczenia potrzeba “calej” klasy a nie tylko jej deklaracji. Dlatego też trick z “class A;” nie podziała ;)