Dziedziczenie, problem z dwuznacznością c++
Ostatnio zmodyfikowano 2015-11-09 22:09
pudeleczko Temat założony przez niniejszego użytkownika |
Dziedziczenie, problem z dwuznacznością c++ » 2015-11-09 19:13:04 #include <cstdlib> #include <iostream>
using namespace std;
class Student { public: string imie; string nazwisko; void Ustaw_imie() { cout << "Podaj imie: " << endl; cin >> imie; } void Ustaw_nazwisko() { cout << "Podaj nazwisko: " << endl; cin >> nazwisko; } };
class Wykladowca { public: string imie; string nazwisko; void Ustaw_imie() { cout << "Podaj imie: " << endl; cin >> imie; } void Ustaw_nazwisko() { cout << "Podaj nazwisko: " << endl; cin >> nazwisko; } };
class StudentUczelni : public Student { public: string Nazwa_uczelni; void Ustaw_uczelnie() { cout << "Podaj Nazwe uczelni: " << endl; cin >> Nazwa_uczelni; } };
class StudentGrupy : public Student { public: string grupa; void Ustaw_grupe() { cout << "Podaj Numer grupy: " << endl; cin >> grupa; } void wyswietl() { cout << imie << " " << nazwisko << " " << grupa << endl; } };
class Przedmiot : public StudentGrupy { string przedmiot; void ustaw_przedmiot() { cout << "Podaj Nazwe przemiotu: " << endl; cin >> przedmiot; } };
class USOS : public Student , public Wykladowca , public Przedmiot { public: string data; int ocena; void wyswietl() { cout << "Dane wykladowcy: " << Wykladowca::nazwisko << " " << Wykladowca::imie << endl << "Dane studenta: " << Student::nazwisko << " " << Student::imie << endl << "Data: " << data << " Ocena: " << ocena << endl; } };
int main( int argc, char * argv[] ) { USOS obiekt; obiekt.Student::nazwisko = "A"; obiekt.Student::imie = "B"; obiekt.Wykladowca::nazwisko = "C"; obiekt.Wykladowca::imie = "D"; obiekt.data = "11.09.2001r."; obiekt.ocena = 3; obiekt.wyswietl(); system( "PAUSE" ); return 0; } Wyskakuje problem: Line 80 direct base 'Student' inaccessible in USOS due to ambiguity |
|
Fireho |
» 2015-11-09 19:57:13 USOS dziedziczy z: - Student - Wykladowca - Przedmiot - StudentGrupy - Student Podsumowując: USOS zawiera w sobie dwukrotnie klasę Student i dlatego jest to dwuznaczne. |
|
carlosmay |
» 2015-11-09 19:58:04 Powtarzają się metody o tej samej nazwie w dwóch klasach. void Wyswietl() w klasie dziedziczonej zrób virtual Klasę Student możesz zrobić Abstrakcyjną klasą bazową. Edit: j23 "dobrze nadaje ;)". Dopisać kilka virtual'i i po sprawie. std::string działa prawidłowo bez #include <string> ? Edit2: @michal11 Fakt. Visual nie obsługuje mi string'a metodą std::cin jak nie dodam nagłówka <string>. W C::B jest ok. |
|
j23 |
» 2015-11-09 20:19:59 Hint: dziedziczenie wirtualne. |
|
michal11 |
» 2015-11-09 22:09:12 @carlosmay
Zależy od kompilatora ale często w iostream jest dodawany string. |
|
« 1 » |