Cześć podczas przerabiania ksiązki o c++ doszedłem do tematu dziedziczenia/polimorfizmu/funkcji wirtualnych - czysto wirtualnych
oraz abstrakcyjnych klas bazowych. Przerabiając ćwiczenia z tych rozdziałów natrafiłem na kilka problemów i w związku z tym mam do was kilka pytań...
Program: używam abstrakcyjnej klasy bazowej c_base oraz 2 klasy 'konkretne' - pochodne czyli klase c_user i c_root program rozdzielony na 3 pliki - definicja klas w pliku hede.h definicje metod klas w pliku definit.cpp i program glowny w pliku system c++.cpp
kod programu:
hede.h
#ifndef hede_h
#define hede_h
#include <iostream>
#include <cstring>
#include <cstdlib>
using std::cin;
using std::cout;
using std::endl;
using std::string;
class c_base
{
private:
string name;
long int size;
public:
c_base(string n1 = "brak nazwy");
virtual void set();
virtual void out() =0;
};
class c_user : c_base
{
private:
string text;
public:
c_user(string t1 = "untitle");
virtual void set();
virtual void out();
};
class c_root : c_base
{
private:
string password;
public:
c_root(string p1 = "root");
virtual void set();
virtual void out();
};
#endif
definit.cpp
#include "hede.h"
c_base::c_base(string n1) : name(n1), size(n1.size())
{
//-----------------
}
void c_base::set()
{
cout<< "name: ";
getline(cin, name);
size = name.size();
}
void c_base::out()
{
cout<< "name: " << name <<endl;
cout<< "size: " <<size <<endl;
}
c_user::c_user(string t1) : c_base(), text(t1)
{
//-----------
}
void c_user::set()
{
c_base::set();
cout<< "text: ";
getline(cin, text);
}
void c_user::out()
{
c_base::out();
cout<< "text: " << text <<endl;
}
c_root::c_root(string p1) : c_base(), password(p1)
{
//-----------
}
void c_root::set()
{
c_base::set();
cout<< "password: ";
getline(cin, password);
}
void c_root::out()
{
c_base::out();
cout<< "password: " << password <<endl;
}
główny program system c++.cpp
#include "hede.h"
#include "definit.cpp"
int main()
{
c_user zmienna1;
zmienna1.set();
zmienna1.out();
cout<<endl;
c_root zmienna2;
zmienna2.set();
zmienna2.out();
system("PAUSE");
}
pytanie 1: zawsze dołączałem (chociaż nigdy nie rozumiałem czemu tak powinno być) plik nagłówkowy .h do definicji metod i później tez do programu głównego w tym wypadku to nie działa muszę zainkludować plik definit.cpp przypuszczam ze ma to związek z funkcjami wirtualnymi ale czy na pewno?
I czy w takim wypadku ma to jakieś znaczenie czy dołączam plik .h czy .cpp jeśli tak to jakie? zaznaczam ze w pliku .h jak widać w kodzie zabezpieczam się przed wielokrotnym podpięciem go #ifndef i tak dalej......
pytanie 2:abstrakcyjne klasy bazowe - faktyczne ułatwienie?
napisałem abstrakcyjna klasę bazowa która zawiera dane i metody których będe używał w innych obiektach ok musiałem napisać wszystkie ich definicje bo później z klas 'konkretnych' nie mam
dostępu do danych prywatnych....
każde dodanie nowych zmiennych w abstrakcyjnej klasie bazowej co ma mi ułatwić życie bo wystarczy ze dodam je tylko tam wiąże się z przerobieniem metod klasy bazowej aby móc zainicjalizować a
dalej wykonywać na nich operacje w klasach 'konkretnych'.....
A każdy pomysł na nowa metodę w której chciałbym wykorzystywać owe zmienne z abstrakcyjnej klasy bazowej sprowadza się znów do napisania takowej metody w tejże klasie po czym wywoływanie jej w klasach pochodnych c_base::jakas_nowa_metoda();
Jak czytałem ten rozdział to rozumiałem idee abstakcyjnych klas bazowych i podobało mi się to ale w momencie
kiedy chciałem to wykorzystać w bardzo prostym programie trochę mnie to.....zastanowiło ;)
być może dlatego ze nie potrafię z racji tego ze jestem początkujący jeżeli chodzi o c++ wykorzystać
pełnych możliwości tego mechanizmu ale po napisaniu tego kodu zadałem sobie pytanie 'nie prościej byłoby napisać 2 osobne nie powiązane niczym klasy? łatwiejsza modyfikacja i rozbudowa programu....
a może wyjściem jest ujęcie danych w klasie bazowej jako protected aby mieć do nich w klasach pochodnych 'łatwiejszy' dostęp?
przepraszam za tak długiego posta rozpisałem się ale chciałem abyście mnie dobrze zrozumieli
z góry dziękuje za wszystkie odpowiedzi pozdrawiam ;)