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

[c++] Dziedziczenie i inicjalizacja konstruktorem klasy bazowej

Ostatnio zmodyfikowano 2017-05-19 16:23
Autor Wiadomość
wojownik266
Temat założony przez niniejszego użytkownika
[c++] Dziedziczenie i inicjalizacja konstruktorem klasy bazowej
» 2017-05-14 22:12:02



Czy istnieje jakiś sposób na zainicjalizowanie zmiennych a1 i b1, klasy pochodnej konstruktorem (listą inicjalizującą) klasy bazowej? W swoich rozwazaniach na ten temat doszedłem do takiego programu i dalej ani rusz…. Ma ktoś jakiś pomysł na rozwiazanie tego problemu?

C/C++
#include <iostream>
using namespace std;

class A //klasa bazowa A
{
protected:
    int a;
    int b;
public:
    A( int n, int m );
    ~A();
    void show_value();
};
A::A( int n, int m )
    : a( n )
     , b( m )
{
   
}
A::~A()
{
   
}
void A::show_value()
{
    cout << "A:" << a << endl;
    cout << "B:" << b << endl;
}
class B
    : public A
{ //Klasa Pochodna B
public:
    int a1;
    int b1;
public:
    B( int n, int m );
    ~B();
    void show_value();
   
};
B::B( int n, int m )
    : A( a, b ) //????
{
   
}
B::~B()
{
   
}
void B::show_value()
{
    cout << "A1:" << a1 << endl;
    cout << "B1:" << b1 << endl;
}
int main()
{
    A an( 10, 10 );
    an.show_value();
    B ba( 5, 5 );
    ba.show_value();
   
    cin.get();
    return 0;
}
P-161102
wojownik266
Temat założony przez niniejszego użytkownika
» 2017-05-14 22:27:38
Ta inicjalizacja ma się odbyć w tym miejscu:
C/C++
B::B( int n, int m )
    : A( a, b ) //????
{
   
}
P-161104
latajacaryba
» 2017-05-14 23:13:00
Chyba nie rozumiem, chcesz, by
zmiennych a1 i b1, klasy pochodnej konstruktorem (listą inicjalizującą) klasy bazowej? 
 lista inicjalizująca konstruktora klasy  bazowej wiedziała, jakie zmienne trzymasz w klasie pochodnej? W ogóle skąd tutaj:
C/C++
B::B( int n, int m )
    : A( a, b ) //????
{
   
}

'a' i 'b'? To jakieś zmienne, skąd konstruktor ma je wziąć? Nie chodziło Ci czasem o to:

C/C++
B::B( int n, int m )
    : A( n, m ) //????
{
   
}
P-161112
wojownik266
Temat założony przez niniejszego użytkownika
» 2017-05-15 05:17:57
W bardzo dużym uproszczeniu chodzi mi o taką inicjalizację:
C/C++
B::B( int n, int m )
    : A( B::a1, B::b1 )
{
   
}

Tylko w tym problem że tak się pewnie nie da zrobić... A poza tym jeszcze nie za bardzo rozumiem o co chodzi w tym kawałku kodu:
C/C++
B::B( int n, int m )
    : A( a, b )
{
   
}
Moim zdaniem ten konstruktor klasy Bazowej A
A( a, b )
 nic nie robi a powinien coś robić. Tak mi się przynajmniej wydaje i byłbym bardzo wdzięczny gdyby ktoś mi objaśnił co on w tym kawałku kodu właściwie robi?
P-161124
karambaHZP
» 2017-05-15 05:42:17
Jakimi wartościami zainicjalizowane są pola a1 i b1?
C/C++
B::B( int n, int m )
    : A( B::a1, B::b1 )
{
   
}

Wychodzi na to, że chcesz aby pola klasy A i B miały te same wartości. Choć nie widzę sensu w takim działaniu. Jeśli mają być takie same to korzystaj tylko z pól klasy A. Klasa B je dziedziczy więc nie ma potrzeby w klasie B umieszczać dokładnie tego samego.

Moim zdaniem ten konstruktor klasy Bazowej A A( a, b ) nic nie robi a powinien coś robić.
Kompilator nie wie co to jest a i b w odniesieniu do tego konstruktora, co już było powiedziane. Co twoim zdaniem ma robić wywołanie konstruktora?
P-161126
wojownik266
Temat założony przez niniejszego użytkownika
» 2017-05-15 05:50:04
Moim zdaniem wywołanie konstruktora powinno nadać wartości zmiennym np a i b;
P-161127
karambaHZP
» 2017-05-15 06:41:50
Co chcesz osiągnąć? Nie ma sensu dziedziczyć jeśli w obu klasach używasz takich samych pól.
C/C++
class A {
protected:
    int a;
public:
    A( int n )
        : a
    { n } { }
};

class B
    : public A
{
    int b;
public:
    B( int na, int nb )
        : A( na )
         , b
    { nb } { }
    void show_ab()
    {
        std::cout << this->a << ' ' << this->b << std::endl;
    }
};

int main()
{
    B b_obj( 2, 4 );
    b_obj.show_ab();
}
P-161130
latajacaryba
» 2017-05-15 09:28:59
Tylko w tym problem że tak się pewnie nie da zrobić... A poza tym jeszcze nie za bardzo rozumiem o co chodzi w tym kawałku kodu:
C/C++
B::B( int n, int m )
    : A( a, b )
{
   
}
To konstruktor klasy B. Klasa b zawiera zmienne z klasy A oraz swoje wlasne czyli
Int a,b, a1, b1.
W konstruktorze klasy B (lista inicjalizacyjna) wywolujesz konstruktor klasy A (inicjalizuje on zmienne a oraz b czyli wykonuje "swoja czesc roboty", w koncu odpowiada on za klase A z ktorej dziedziczy B.).
natomiast nie bardzo rozumiem Twojego zapisu z tego wzgledu, ze na liscie inicjalizacyjnej B konstruktor A przyjmuje argumenty a i b które nie są nigdzie przesylane. Ja bym to zrobil tak:
C/C++
B::B( int n, int m, int a, int b )
    : A( a, b )
{
    a1 = n;
    b1 = m;
}
To a1 i b1 tez mozesz inicjalizowac na liscie.
P-161134
« 1 » 2
  Strona 1 z 2 Następna strona