Lich555 Temat założony przez niniejszego użytkownika |
Konstruktor w 2 poziomowej hierarchii klas » 2017-04-26 19:11:07 Witam. Mam klasę bazową Animal oraz klasę pochodną Fish. Animal.h #ifndef ANIMAL_H #define ANIMAL_H
#include <iostream> #include <string>
class Animal { protected: int age; float weight, xsize; std::string name; public: Animal() { age = 0; } virtual ~Animal() { std::cout << "Animal's dectructor\n"; } virtual void breath() { std::cout << "Animal's breathing\n"; } virtual void movee() { std::cout << "Animal's moving\n"; } };
#endif
Fish #ifndef FISH_H #define FISH_H
#include <iostream> #include <string> #include "Animal.h"
class Fish : public Animal { public: Fish( float fWeight, float fxSize, std::string fName ) : weight( fWeight ) , xsize( fxSize ) { name = fName; } virtual ~Fish() { std::cout << "Fish destructor\n"; } void breath() { std::cout << "Fish's breathing\n"; } };
#endif
Wywala mi błędy Klasa Fish nie ma żadnego pola o nazwie 'weight' i 'xsize'. Ciało konstruktora z Fish można przepisać bez konsekwencji do Animal, a konstruktora z Fish zostawić pustego? |
|
pekfos |
» 2017-04-26 19:17:39 Składowe klasy X może inicjalizować tylko konstruktor klasy X. |
|
Lich555 Temat założony przez niniejszego użytkownika |
» 2017-04-26 20:20:31 A o string name się nie rzuca. |
|
marcolo2307 |
» 2017-04-26 20:26:58 Bo nie jest na liście inicjalizacyjnej, tylko w ciele konstruktora. |
|
Lich555 Temat założony przez niniejszego użytkownika |
» 2017-04-26 22:12:28 Trochę to zaprzecza odpowiedzi pekfosa, nie uważasz? :P Inicjalizacja stringa jest w ciele konstruktora klasy Y, a składowe klasy X może inicjalizować tylko konstruktor klasy X.
@Edit Moim zdaniem tutaj pekfos użył takiego skrótu. Bo właśnie chyba lista inicjalizacyjna nie może tego robić, a konstruktor może. Działoby się to w ten sposób dlatego, że przy odpalaniu konstruktora pochodnej klasy Fish, odpalany jest najpierw konstruktor klasy bazowej Animal. Tak, czy nie tak? :P |
|
marcolo2307 |
» 2017-04-26 23:00:04 Konstruktor bazowej jest wywoływany na liście inicjalizacyjnej, dlatego dopiero w ciele konstruktora masz dostęp do jej zmiennych. |
|
darko202 |
» 2017-04-27 14:58:50 1. >> dopiero w ciele konstruktora masz dostęp do jej zmiennych to nie jest tak do końca - jest inna konstrukcja (albo źle Cię zrozumiałem) np. z http://we.pb.edu.pl/~rpbyc/dydaktyka/dziedziczenie.htmlclass Punkt { protected: float X, Y; public: Punkt( float x, float y ) : X( x ) , Y( y ) { } float getX() { return X; } float getY() { return Y; } };
class Punkt3D : public Punkt { protected: float Z; public: Punkt3D( float x, float y, float z ) : Punkt( x, y ) , Z( z ) { } float getZ() { return Z; } };
http://cpp0x.pl/kursy/Programowanie-obiektowe-C++/Polimorfizm/Dziedziczenie/4942. mamy też magiczne słowo base https://4programmers.net/C_sharp/S%C5%82owa_kluczowe_this_i_base class Baza { int pole; }
class Pochodna : Baza { int pole; public Pochodna() { base.pole = 25; pole = 100; } }
class Baza { public Baza( int arg ) { } }
class Pochodna : Baza { public Pochodna( int arg ) : base( arg ) { } }
public Pochodna( int arg1, int arg2 ) : base.pole1( arg1 ) , base.pole2( arg2 ) ,... public Pochodna( int arg1, char chr2 ) : Bazowa( arg1 ) , Bazowa( chr2 ) ,...
|
|
pekfos |
» 2017-04-27 22:11:16 Trochę to zaprzecza odpowiedzi pekfosa, nie uważasz? :P Inicjalizacja stringa jest w ciele konstruktora klasy Y, a składowe klasy X może inicjalizować tylko konstruktor klasy X. |
Nie zaprzecza, jeśli się wie co to jest inicjalizacja. std::string asd; asd = "123";
|
|
« 1 » 2 |