Mam trudny czas z regułami wywoływania dla konstruktorów w hierarchii typów. Oto co mam zrobić:Hierarchia wywołań konstruktora
class A{
protected:
int _i;
public:
A(){i = 0;}
A(int i) : _i(i){}
virtual ~A(){}
virtual void print(){std::cout<<i<<std::endl;}
};
class B : virtual public A{
protected:
int _j;
public:
B() : A(){_j = 0;}
B(int i, int j) : A(i), _j(j){}
virtual ~B(){}
virtual void print(){std::cout<<i<<", "<<j<<std::endl;}
};
class C : virtual public B{
protected:
int _k;
public:
C() : B(){_k = 0;}
C(int i, int j, int k} : B(i,j), _k(k){}
virtual ~C(){}
virtual void print(){std::cout<<i<<", "<<j<<", "<<k<<std::endl;}
};
int main(){
C* myC = new C(1,2,3);
myC->print();
delete myC;
return 0;
}
Teraz chciałbym mieć nową C (1,2,3) wywołanie konstruktora z B (1,2), które potem z kolei powinno wywołać konstruktor A (1) do przechowywania _i = 1, _j = 2, _k = 3. Podczas tworzenia instancji myC klasy C, z jakiegoś powodu nie rozumiem, pierwszy konstruktor, który ma zostać wywołany, jest standardowym konstruktorem A, tj. A :: A(); To oczywiście prowadzi do błędnych wyników, ponieważ zabezpieczonej zmiennej _i przypisuje się wartość 0. Konstruktor A (1) nigdy nie jest wywoływany. Dlaczego tak jest? Uważam to za bardzo sprzeczne z intuicją. Czy istnieje sposób uniknięcia jawnego wywoływania wszystkich konstruktorów w hierarchii typów w celu osiągnięcia pożądanego zachowania?
Thx za pomoc!
Thx za miłe odpowiedzi. Myślę więc, że wrócę do Stroustrup, aby ponownie przeczytać koncepcję wirtualnego dziedziczenia. Wygląda na to, że nie jest rozsądnie używać go domyślnie;) – user1999920
Wiele osób zastanawia się, dlaczego domyślnie dziedziczenie nie jest wirtualne. Cóż, sam znalazłeś odpowiedź :) – Gorpik