Kaikso Temat założony przez niniejszego użytkownika |
» 2015-07-25 15:23:53 @Up: A jaki ma to związek z tematem. Tu nie chodzi o kolejność wywoływania konstruktorów, przez kompilator czy kolejność dziedziczenia. Zmienię kolejność dziedziczenia, a problem „przeskoczy” między klasami bazowymi. |
|
jankowalski25 |
» 2015-07-25 15:34:31 W Twoim kodzie zmiana kolejności dziedziczenia powoduje przejście z obecnego do oczekiwanego wyniku, więc nie rozumiem, w czym problem. problem „przeskoczy” między klasami bazowymi |
Podaj przykład, który to pokazuje, bo poprzedni kod nie uwzględnia tego problemu. |
|
Kaikso Temat założony przez niniejszego użytkownika |
» 2015-07-25 15:54:52 W Twoim kodzie zmiana kolejności dziedziczenia powoduje przejście z obecnego do oczekiwanego wyniku, więc nie rozumiem, w czym problem. |
Nie rozumie, gdzie są jakieś niejasności odnośnie problemu. Podaj przykład, który to pokazuje, bo poprzedni kod nie uwzględnia tego problemu. |
Uzupełniony kod: #include <iostream>
struct Bazowa_A { int a; }; struct Bazowa_B { int b; }; struct Bazowa_C { int c; };
class Pochodna_AB : virtual public Bazowa_A , virtual public Bazowa_B { };
class Pochodna_AC : virtual public Bazowa_A , virtual public Bazowa_C { };
class Pochodna_BC : virtual public Bazowa_B , virtual public Bazowa_C { public: Pochodna_BC( int b, int c ) { this->b = b; this->c = c; } virtual void test_bc() { std::cout << "----- test_bc() ------" << std::endl; std::cout << "b = " << b << std::endl; std::cout << "c = " << c << std::endl; } };
class Pochodna_AB_BC : virtual public Pochodna_AB , virtual public Pochodna_AC { public: Pochodna_AB_BC( int a, int b, int c ) { this->a = a; this->b = b; this->c = c; } virtual void test_abc() { std::cout << "----- test_abc() ------" << std::endl; std::cout << "a = " << a << std::endl; std::cout << "b = " << b << std::endl; std::cout << "c = " << c << std::endl; } };
class Klasa_X final : public Pochodna_AB_BC , public Pochodna_BC { public: Klasa_X() : Pochodna_BC( 0, 1 ) , Pochodna_AB_BC( 2, 3, 4 ) { } };
int main() { Klasa_X x; x.test_bc(); x.test_abc(); return 0; }
Wynik: ----- test_bc() ------ b = 0 c = 1 ----- test_abc() ------ a = 2 b = 0 c = 1
Dla porównania efekt po małej zmianie w kodu: #include <iostream>
struct Bazowa_A { int a; }; struct Bazowa_B { int b; }; struct Bazowa_C { int c; };
class Pochodna_AB : virtual public Bazowa_A , virtual public Bazowa_B { };
class Pochodna_AC : virtual public Bazowa_A , virtual public Bazowa_C { };
class Pochodna_BC : public Bazowa_B , public Bazowa_C { public: Pochodna_BC( int b, int c ) { this->b = b; this->c = c; } virtual void test_bc() { std::cout << "----- test_bc() ------" << std::endl; std::cout << "b = " << b << std::endl; std::cout << "c = " << c << std::endl; } };
class Pochodna_AB_BC : public Pochodna_AB , public Pochodna_AC { public: Pochodna_AB_BC( int a, int b, int c ) { this->a = a; this->b = b; this->c = c; } virtual void test_abc() { std::cout << "----- test_abc() ------" << std::endl; std::cout << "a = " << a << std::endl; std::cout << "b = " << b << std::endl; std::cout << "c = " << c << std::endl; } };
class Klasa_X final : public Pochodna_AB_BC , public Pochodna_BC { public: Klasa_X() : Pochodna_BC( 0, 1 ) , Pochodna_AB_BC( 2, 3, 4 ) { } };
int main() { Klasa_X x; x.test_bc(); x.test_abc(); return 0; }
Wynik: ----- test_bc() ------ b = 0 c = 1 ----- test_abc() ------ a = 2 b = 3 c = 4
Niestety ja nie mam wpływu na kod biblioteki! |
|
jankowalski25 |
» 2015-07-25 16:07:16 Podaj prawidłowy wynik, który chcesz uzyskać. |
|
Kaikso Temat założony przez niniejszego użytkownika |
» 2015-07-25 16:14:20 ----- test_bc() ------ b = 0 c = 1 ----- test_abc() ------ a = 2 b = 3 c = 4
|
|
jankowalski25 |
» 2015-07-25 16:18:44 Przecież właśnie taki wynik daje twój ostatni przykład! Nie rozumiem, w czym problem. |
|
Kaikso Temat założony przez niniejszego użytkownika |
» 2015-07-25 16:23:18 Pierwszy post: Uwaga! Wszystkie klasy bazowe pochodzą z zewnętrznej biblioteki, na którą ja nie mam wpływu. |
|
Ostatni post z kodem: Niestety ja nie mam wpływu na kod biblioteki! |
@Up: Drugi przykład to demonstracja tego co chcę osiągnąć. Ja mam wpływ tylko na klasę Klasa_X. |
|
jankowalski25 |
» 2015-07-25 16:36:51 Jeśli ktoś zna jakąś sztuczkę na oddzielenie składowych klas bazowych od siebie nawzajem, to proszę o sugestię. |
Możesz zamiast dziedziczenia umieścić obiekty tych klas w swojej klasie i z nich korzystać. Wtedy ich składowe będą niezależne. |
|
1 « 2 » 3 |