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

Dziedziczenie, problem z dwuznacznością c++

Ostatnio zmodyfikowano 2015-11-09 22:09
Autor Wiadomość
pudeleczko
Temat założony przez niniejszego użytkownika
Dziedziczenie, problem z dwuznacznością c++
» 2015-11-09 19:13:04
C/C++
#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
P-139869
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.
P-139870
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.
P-139871
j23
» 2015-11-09 20:19:59
Hint: dziedziczenie wirtualne.
P-139874
michal11
» 2015-11-09 22:09:12
@carlosmay

Zależy od kompilatora ale często w iostream jest dodawany string.
P-139882
« 1 »
  Strona 1 z 1