zielak123 Temat założony przez niniejszego użytkownika |
[C++]Polimorfizm klas » 2015-11-15 19:12:35 #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) |
|
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.
|
|
zielak123 Temat założony przez niniejszego użytkownika |
» 2015-11-15 19:39:23 Jak zrobic zwracania funkcji na dziedziczeniu? |
|
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'. |
|
zielak123 Temat założony przez niniejszego użytkownika |
» 2015-11-15 20:07:00 #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. |
|
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. |
|
zielak123 Temat założony przez niniejszego użytkownika |
» 2015-11-15 20:48:14 #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 Walec( double r, double h ) : R( r ) , H( h ) { } |
|
carlosmay |
» 2015-11-15 21:05:29 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. #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; } double GetPole() { return pole; } void oblicz() { cout << "Podaj promien: "; cin >> r; pole = M_PI * pow( r, 2 ); } 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 ) , h( ih ) , pole_boczne( 2 * M_PI * GetPromien() * ih ) , pole_calkowite( GetPole() * ih ) { } ~Walec() { } void oblicz() { cout << "Podaj wysokosc walca: "; cin >> h; Kolo::oblicz(); pole_boczne = 2 * M_PI * GetPromien() * h; pole_calkowite = GetPole() * h; 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. |
|
« 1 » 2 |