• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Dziedziczenie wielokrotne, inicjalizacja

Object Storage Arubacloud
0 głosów
144 wizyt
pytanie zadane 27 czerwca 2018 w C i C++ przez 99xkubax99 Obywatel (1,780 p.)

Witam, mam tutaj pewien projekt z zadania z książki Stephena Praty:

Plik .h:

#include <string>
using namespace std;
class fink;
class manager;
class abstr_emp
{
private:
	string fname;
	string lname;
	string job;
public:
	abstr_emp();
	abstr_emp(const manager&m1);
	abstr_emp(const fink&f1);
	abstr_emp(const string &, const string &, const string &);
	virtual void ShowAll() const;
	virtual void SetAll();
	friend ostream & operator<<(ostream &, const abstr_emp&);
	virtual ~abstr_emp() = 0;
};
class employee : public abstr_emp
{
public:
	employee();
	employee(const string & fn, const string &ln, const string & j);
	virtual void ShowAll() const;
	virtual void SetAll();
};
class manager :virtual public abstr_emp
{
private:
	int inchargeof;
protected:
	int InChargeOf() const { return inchargeof; }
	int & InChargeOf() { return inchargeof; }
public:
	manager();
	manager(const string & fn, const string & ln, const string & j, int ico = 0);
	manager(const abstr_emp & e, int ico);
	manager(const fink&m, int ico);
	void ShowIco() const { cout << inchargeof << endl; }

	virtual void ShowAll() const;
	virtual void SetAll();
};
class fink : virtual public abstr_emp
{
private:
	string reportsto;
protected:
	const string ReportsTo() const { return reportsto; }
	string & ReportsTo() { return reportsto; }
public:
	fink();
	fink(const string & fn, const string & ln, const string & j, const string & rpo);
	fink(const abstr_emp & e, const string &rpo);
	fink(const manager & e, string & rpo);
	void ShowRpo() const { cout << reportsto << endl; }
	virtual void ShowAll() const;
	virtual void SetAll();
};
class highfink : public manager, public fink
{
public:
	highfink();
	highfink(const string & fn, const string & ln, const string & j, const string & rpo, int ico);
	highfink(const abstr_emp & e, const string & rpo, int ico);
	highfink(const fink & f, int ico);
	highfink(const manager & m, const string & rpo);
	highfink(const highfink&h);
	virtual void ShowAll() const;
	virtual void SetAll() {};
};

oraz plik .cpp :

#include "stdafx.h"
#include <iostream>
#include <string>
#include "Nagłówek.h"

using namespace std;

abstr_emp::abstr_emp(const string & fn, const string & ln, const string & j) {
	fname = fn;
	lname = ln;
	job = j;
}

abstr_emp::abstr_emp() {
	fname = "unknown";
	lname = "unknown";
	job = "unknown";
}

abstr_emp::abstr_emp(const manager&m1) {
	fname = m1.fname;
	lname = m1.lname;
	job = m1.job;
}

abstr_emp::abstr_emp(const fink&f1) {
	fname = f1.fname;
	lname = f1.lname;
	job = f1.job;
}

ostream & operator<<(ostream & s, const abstr_emp & e) {
	s << e.fname << " " << e.lname << " " << e.job << endl;
	return s;
}
void abstr_emp::ShowAll() const {
	cout << fname << " " << lname << " " << job << endl;
}
void abstr_emp::SetAll() {
	cin >> fname >> lname >> job;
}
abstr_emp::~abstr_emp() {}

employee::employee(const string & fn, const string &ln, const string & j) :abstr_emp(fn, ln, j) {}
void employee::ShowAll() const {
	abstr_emp::ShowAll();
}
void employee::SetAll() {
	abstr_emp::SetAll();
}

manager::manager(const string & fn, const string & ln, const string & j, int ico) : abstr_emp(fn, ln, j), inchargeof(ico) {}
manager::manager(const abstr_emp & e, int ico) : abstr_emp(e), inchargeof(ico) {}
manager::manager(const fink&m, int ico):abstr_emp(m), inchargeof(ico){}
void manager::ShowAll() const {
	abstr_emp::ShowAll();
	manager::ShowIco();
}
void manager::SetAll() {
	int temp;
	abstr_emp::SetAll();
	cin >> temp;
	InChargeOf() = temp;
}

fink::fink(const string & fn, const string & ln, const string & j, const string & rpo) :abstr_emp(fn, ln, j), reportsto(rpo) {}
fink::fink(const abstr_emp & e, const string &rpo) : abstr_emp(e), reportsto(rpo) {}
fink::fink(const manager & e, string & rpo):abstr_emp(e), reportsto(rpo) {}
void fink::ShowAll() const {
	abstr_emp::ShowAll();
	fink::ShowRpo();
}
void fink::SetAll() {
	abstr_emp::SetAll();
	string temp;
	cin >> temp;
	ReportsTo() = temp;
}

highfink::highfink(const string & fn, const string & ln, const string & j, const string & rpo, int ico) : abstr_emp(fn, ln, j), manager(fn, ln, j, ico), fink(fn, ln, j, rpo) {}
highfink::highfink(const abstr_emp & e, const string & rpo, int ico) : abstr_emp(e), manager(e, ico), fink(e, rpo) {}
highfink::highfink(const fink & f, int ico):fink(f),manager(f,ico){}
highfink::highfink(const manager & m, const string & rpo):fink(m,rpo),manager(m){}
void highfink::ShowAll() const {
	abstr_emp::ShowAll();	
    fink::ShowRpo();
    manager::ShowIco();
}

Wcześniej umieściłem tutaj pytanie dotyczącego tego samego projektu, odnośnie konstruktorów. Problem został rozwiązany ale pojawiła się nowa niejasność. Po skompilowaniu tworzę obiekt klasy manager, załóżmy manager m1("John","Smith","doctor",5). Metoda ShowAll() pokazuje poprawnie wszystkie informacje. Następnie chciałbym wykorzystać obiekt tej klasy w konstruktorze highfink. A więc: highfink(m1,"rep"). I problem pojawia się podczas wywołania metody ShowAll(), ponieważ wyświetla ona zamiast "John Smith doctor rep 5", to "unknown unknown unknown rep 5", więc dla obiektu klasy bazowej są wyświetlane wartości domyślne. Proszę o pomoc oraz doradzenie jakie zmiany powinienem poczynić, aby metoda ShowAll klasy highfink działała poprawnie.

komentarz 28 czerwca 2018 przez pietrzakacper Mądrala (7,480 p.)
Pokaż kod w którym faktycznie korzystasz z instancji tych klas :)
komentarz 28 czerwca 2018 przez 99xkubax99 Obywatel (1,780 p.)
już problem rozwiązany ;)

1 odpowiedź

+1 głos
odpowiedź 28 czerwca 2018 przez RafalS VIP (122,820 p.)
edycja 28 czerwca 2018 przez RafalS
 
Najlepsza

Ok już wiem. Za konstrukcje obiektów dziedziczonych wirtualnie odpowiada klasa najbardziej pochodna. Więc:

highfink::highfink(const manager & m, const string & rpo) : fink(m, rpo), manager(m) {}

nie ma jawnego wywołania konstruktora abstr_emp więc wywoływany jest konstruktor domyślny, który ustawia "unknown". 

Przy okazji zauważyłem też, że:

fink::fink(const abstr_emp & e, const string &rpo) : abstr_emp(e), reportsto(rpo) {}
fink::fink(const manager & e, string & rpo) : abstr_emp(e), reportsto(rpo) {}

jak przesyłasz const string& to nigdy nie zostanie użyty drugi konstruktor.

komentarz 28 czerwca 2018 przez 99xkubax99 Obywatel (1,780 p.)
edycja 28 czerwca 2018 przez 99xkubax99
rzeczywiście, to rozwiązało problem, dzięki wielkie. byłem przekonany, że skoro klasa abstr_emp jest czysto wirtualna to nie muszę wywoływać listą jej konstruktora, a jednak :)

Podobne pytania

0 głosów
1 odpowiedź 190 wizyt
pytanie zadane 22 maja 2017 w C i C++ przez Sensej Użytkownik (540 p.)
0 głosów
1 odpowiedź 629 wizyt
pytanie zadane 20 lutego 2016 w C i C++ przez Turqus Obywatel (1,420 p.)
0 głosów
0 odpowiedzi 254 wizyt

92,555 zapytań

141,404 odpowiedzi

319,559 komentarzy

61,940 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...