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

Konstruktor w 2 poziomowej hierarchii klas

Ostatnio zmodyfikowano 2017-05-16 20:13
Autor Wiadomość
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
C/C++
#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 // ANIMAL_H

Fish
C/C++
#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 // FISH_H

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?
P-160526
pekfos
» 2017-04-26 19:17:39
Składowe klasy X może inicjalizować tylko konstruktor klasy X.
P-160527
Lich555
Temat założony przez niniejszego użytkownika
» 2017-04-26 20:20:31
A o string name się nie rzuca.
P-160532
marcolo2307
» 2017-04-26 20:26:58
Bo nie jest na liście inicjalizacyjnej, tylko w ciele konstruktora.
P-160533
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
P-160537
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.
P-160538
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.html

C/C++
class Punkt {
protected:
    float X, Y;
   
public:
    Punkt( float x, float y )
        : X( x )
         , Y( y )
    { } // konstruktor
    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 )
    { } // konstruktor
    float getZ() { return Z; }
};

http://cpp0x.pl/kursy​/Programowanie-obiektowe-C++​/Polimorfizm/Dziedziczenie/494

2.
mamy też magiczne słowo base
https://4programmers.net​/C_sharp​/S%C5%82owa_kluczowe_this_i_base

C/C++
//a.
class Baza
{
    int pole;
}

class Pochodna
    : Baza
{
    int pole;
    public Pochodna()
    {
        base.pole = 25; // ustawiamy pole klasy bazowej
        pole = 100; // ustawiamy pole klasy pochodnej
    }
}
//b.
class Baza
{
    public Baza( int arg )
    {
    }
}

class Pochodna
    : Baza
{
    public Pochodna( int arg )
        : base( arg )
    {
        // przekazaliśmy konstruktorowi bazy argument `arg`
    }
}


 
C/C++
//a. nie chce mi się sprawdzać, ale raczej nie zadziałałoby
public Pochodna( int arg1, int arg2 )
    : base.pole1( arg1 )
     , base.pole2( arg2 )
     ,...//b. ale tak public Pochodna( int arg1, char chr2 )
    : Bazowa( arg1 )
     , Bazowa( chr2 )
     ,...
P-160555
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.
C/C++
std::string asd; // inicjalizacja (domyślny konstruktor string)
asd = "123"; // przypisanie wartości
P-160567
« 1 » 2
  Strona 1 z 2 Następna strona