Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Oddzielanie klas dziedziczących wirtualnie.

Ostatnio zmodyfikowano 2015-07-28 19:56
Autor Wiadomość
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.
P-135211
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.
P-135213
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:
C/C++
#include <iostream>

struct Bazowa_A { int a; };
struct Bazowa_B { int b; };
struct Bazowa_C { int c; };

// Klasy pochodne - I Pokolenie
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;
    }
};

// Klasy pochodne - II Pokolenie
class Pochodna_AB_BC // Klasa Bazowa_B jest wspólna dla obu klas bazowych
    : 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;
    }
};

// Nasza klasa
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:

C/C++
#include <iostream>

struct Bazowa_A { int a; };
struct Bazowa_B { int b; };
struct Bazowa_C { int c; };

// Klasy pochodne - I Pokolenie
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;
    }
};

// Klasy pochodne - II Pokolenie
class Pochodna_AB_BC // Klasa Bazowa_B jest wspólna dla obu klas bazowych
    : 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;
    }
};

// Nasza klasa
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!
P-135218
jankowalski25
» 2015-07-25 16:07:16
Podaj prawidłowy wynik, który chcesz uzyskać.
P-135219
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
P-135221
jankowalski25
» 2015-07-25 16:18:44
Przecież właśnie taki wynik daje twój ostatni przykład! Nie rozumiem, w czym problem.
P-135223
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.
P-135225
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.
P-135227
1 « 2 » 3
Poprzednia strona Strona 2 z 3 Następna strona