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

[C++]Polimorfizm klas

Ostatnio zmodyfikowano 2015-11-15 21:53
Autor Wiadomość
zielak123
Temat założony przez niniejszego użytkownika
[C++]Polimorfizm klas
» 2015-11-15 19:12:35
C/C++
#include <iostream>
#include <fstream>
#include <string>
#include <cstdlib>

using namespace std;

class Kolo {
public:
    int r;
    double oblicz() {
        cout << "Podaj promien kola: ";
        cin >> r;
        cout << endl;
        double P( 3.14 *( r * r ) );
        cout << "Pole kola wynosi: " << P << endl;
        cout << endl;
    }
};

class Walec
    : public Kolo
{
public:
    int r;
    int h;
    double oblicz() {
        cout << "Podaj promien walca: ";
        cin >> r;
        cout << "Podaj wysokosc walca: ";
        cin >> h;
        double V( 3.14 *( r * r ) * h );
        cout << endl;
        cout << "Objetosc walca wynosi: " << V << endl;
    }
};
int main() {
    Kolo * kolo = new Walec();
    Walec * walec = new Walec();
    kolo->oblicz();
    walec->oblicz();
    return 0;
}
Czy prawidlowo zaimplementowalem polimorfie klas? W zalozeniu klasa walec jest podklasa klasy Kolo i obydwie klasy posiadaja metode
double oblicz()
 obliczajaca pole(kola) i objetosc(walca)
P-140183
carlosmay
» 2015-11-15 19:15:59
metody nie zwracają wartości.
Ideą używania klas jest hermetyzacja. Wszystkie składowe, które nie muszą być publiczne powinny być prywatne.
P-140185
zielak123
Temat założony przez niniejszego użytkownika
» 2015-11-15 19:39:23
Jak zrobic zwracania funkcji na dziedziczeniu?
P-140186
carlosmay
» 2015-11-15 19:45:56
Odpowiadając na pytanie: dziedzicząc po innej klasie, dziedziczy się wszystkie składowe (zależnie od poziomu dostępu dziedziczenia)
i należy używać metod i składowych klasy z której się dziedziczy.
Jeżeli klasa 'Walec' dziedziczy po klasie 'Kolo' to do obliczenia objętości walca używasz metody obliczającej pole z klasy 'Kolo'.
Klasa 'Walec' dziedziczy promień poprzez metodę oblicz() więc jest zbędna w klasie 'Walec'.
P-140187
zielak123
Temat założony przez niniejszego użytkownika
» 2015-11-15 20:07:00
C/C++
#include <iostream>
#include <fstream>
#include <string>
#include <cstdlib>

using namespace std;

class Kolo {
   
public:
    int r;
    int h;
    double oblicz( int r ) {
        return( 3.14 *( r * r ) );
    }
};

class Walec
    : public Kolo
{
   
   
public:
   
   
    double oblicz( int r, int h ) {
        return( 3.14 *( r * r ) * h );
    }
};
int main() {
    Kolo * kolo = new Walec();
    Walec * walec = new Walec();
    cout << "Pole kola wynosi: " << kolo->oblicz( 3 );
    cout << "Objetosc walca wynosi: " << walec->oblicz( 2, 3 );
    return 0;
}
Dobrze sa zwracania teraz?
Nadal nie wiem w jaki sposob dziedziczy promien z kola.
P-140190
carlosmay
» 2015-11-15 20:35:47
Zastanów się co ma reprezentować klasa 'Kolo', a co klasa 'Walec'.
Kolo ma promień (nie ma wysokości) oraz pole powierzchni. (to powinna zawierać klasa 'Kolo')
Walec ma promień (pole podstawy), wysokość, objętość, pole boczne i pole całkowite. (to powinna zawierać klasa 'Walec')

Klasa 'Walec' powinna korzystać ze składowych klasy 'Kolo' do obliczenia swoich składowych.
P-140192
zielak123
Temat założony przez niniejszego użytkownika
» 2015-11-15 20:48:14
C/C++
#include <iostream>
#include <fstream>
#include <string>
#include <cstdlib>

using namespace std;

class Kolo {
   
public:
    int R;
    Kolo( double r )
        : R( r )
    { }
    double oblicz() {
        return( 3.14 *( R * R ) );
    }
};

class Walec
    : public Kolo
{
public:
    int R, H;
    Walec( double r, double h )
        : R( r )
         , H( h )
    { }
    double oblicz() {
        return( 3.14 *( R * R ) * H );
    }
};
int main( void ) {
    Kolo kolo( 3 );
    Walec walec( 3, 3 );
    cout << "Pole kola wynosi: " << kolo.oblicz() << "\nObjetosc walca wynosi: " << walec.oblicz();
    return 0;
}

In constructor 'Walec::Walec(double, double)':
[Error] no matching function for call to 'Kolo::Kolo()'
Dokladnie chodzi o te linijke
C/C++
Walec( double r, double h )
    : R( r )
     , H( h )
{ }
P-140193
carlosmay
» 2015-11-15 21:05:29
C/C++
int R;
Kolo( double r )
 składow jest int a argument double, utracisz precyzję.

Jeśli tworzysz konstruktor z argumentami musisz utworzyć też domyślny.

Wrzucam taki kod do analizy: klasa 'Walec' używa składowych klasy 'Kolo' do obliczenia swoich składowych.
r - jest tylko w klasie 'Kolo', bo klasa 'Walec' może z niego korzystać, więc nie potrzebuje w swoich składowych.
C/C++
#define _USE_MATH_DEFINES
#include <iostream>
#include <cmath>
using namespace std;

class Kolo {
    double r;
    double pole;
public:
    Kolo()
        : r( 0 )
         , pole( 0 )
    { }
    Kolo( double ir )
        : r( ir )
         , pole( pow( ir, 2 ) )
    { }
    ~Kolo() { }
    double GetPromien() { return r; } // pobiera promin
    double GetPole() { return pole; } // pobiera pole
    void oblicz() {
        cout << "Podaj promien: ";
        cin >> r;
        pole = M_PI * pow( r, 2 ); // M_PI liczba PI, pow() funkcja potega
    }
   
    void show() {
        cout << "Pole kola o promienu " << r << " wynosi: " << pole << endl;
    }
};

class Walec
    : public Kolo
{
    double h;
    double objetosc;
    double pole_boczne;
    double pole_calkowite;
public:
    Walec()
        : Kolo()
         , h( 0 )
         , pole_boczne( 0 )
         , pole_calkowite( 0 )
    { }
    Walec( double ir, double ih ) // Kolo(ir) uzycie konstruktora klasy 'Kolo'
        : Kolo( ir )
         , h( ih )
         , pole_boczne( 2 * M_PI * GetPromien() * ih )
         , pole_calkowite( GetPole() * ih )
    { }
    ~Walec() { }
    void oblicz() {
        cout << "Podaj wysokosc walca: ";
        cin >> h;
        Kolo::oblicz(); // uzywa metody klasy 'Kolo'
        pole_boczne = 2 * M_PI * GetPromien() * h; // uzywa metody pobierajacej promien
        pole_calkowite = GetPole() * h; // uzywa metody pobirajacej pole
        objetosc = GetPole() * h;
    }
   
    void show() {
        cout << "Walec o promienu " << GetPromien() << " i wysokosci "
        << h << " ma:\n pole podstawy " << GetPole() << "\nPole boczne " << pole_boczne
        << "\npole calkowite " << pole_calkowite
        << "\nobjetosc " << objetosc << endl;
    }
};
int main() {
    Kolo kolo2;
    Walec walec2;
    kolo2.oblicz();
    walec2.oblicz();
    kolo2.show();
    walec2.show();
   
    return 0;
}
 Myślę, że idea będzie czytelna.
P-140194
« 1 » 2
  Strona 1 z 2 Następna strona