2014-10-19 5 views
0

Заявление об ошибке:Как я могу создать экземпляры частных данных из двух базовых классов, определив конструктор производного класса?

Создайте базовый класс под названием Студент с фоллом. 2 поля: - (i) Название (ii) Id. Выведите 2 класса под названием Спорт и Экзамен со студенческого базового класса. Класс Sports имеет поле под названием s_grade и Класс Экзамен имеет поле, называемое e_grade, которые являются целыми полями. Выведите класс под названием «Результаты» , которые наследуются от спорта и экзамена. Этот класс имеет массив символов или строковое поле для представления конечного результата. Также он имеет функцию-член, называемую дисплеем, которая может использоваться для отображения окончательного результата . Проиллюстрируйте использование этих классов в основном.

#include<iostream> 
#include<string> 
using namespace std; 

class Student 
{ 
    string name; 
    int id; 

    public: 
     Student(string n, int a) {name = n; id = a;} 
     void display() 
     { 
      cout<<"Student name: "<<name; 
      cout<<"\nStudent I.D.: "<<id; 
     } 
}; 

class Sports : public Student 
{ 
    int s_grade; 

    public: 
     Sports(string n, int a,int s):Student(n,a) {s_grade = s;} 
     void display() 
     { 
      cout<<"\nSports grade: "<<s_grade; 
     } 
}; 

class Exam: public Student 
{ 
    int e_grade; 

    public: 
     Exam(string n, int a,int e):Student(n,a) {e_grade = e;} 
     void display() 
     { 
      cout<<"\Exam grade: "<<e_grade; 
     } 
}; 

class Results: public Sports, public Exam 
{ 
    string result; 

    public: 
     Results(string n,int i, int s, int e):Sports(n,i,s):Exam(n,i,e) {} 
     void display() 
     { 
      Student::display(); 
      Sports::display(); 
      Exam::display(); 
     } 
}; 

Это была моя попытка, но это довольно сильно испорчено.

Любые решения?

Любая помощь очень ценится.

+1

1. Передайте строку как ссылку на константу. 2. Используйте списки инициализации. 3. В чем вопрос –

+1

Вызов 'Student :: display();' не должен компилироваться, потому что он неоднозначен: класс 'Results' содержит * два экземпляра' Student' - один через 'Sports' и один через «Экзамен». – cdhowie

+0

@cdhowie Я использовал виртуальное наследование, чтобы наследовать «Студент». Он все еще не компилируется. Что мне делать? –

ответ

3

Студенческий класс должен быть виртуальным. Другим разумным будет результат в двух экземплярах учеников. Это приведет к двусмысленности.

+0

+1, даже если на нее ответили в комментариях. Вам нужна репутация –

+0

Классы не могут быть виртуальными - я предполагаю, что вы имеете в виду, что класс Студента должен быть * унаследован практически *. – cdhowie

+0

Да, я имею в виду это cdhowie. Здесь, в Индии, учитель учит нас, что в гибридном наследовании базовые классы должны быть виртуальными. –

1

Вы должны использовать виртуальное наследование при выводе спорта и экзамена из класса Student. Это гарантирует, что для объекта Results будет создан только один экземпляр Student.

#include<iostream> 
#include<string> 
using namespace std; 

class Student 
{ 
    string name; 
    int id; 

    public: 
     Student(string n, int a) {name = n; id = a;} 
     void display() 
     { 
      cout<<"Student name: "<<name; 
      cout<<"\nStudent I.D.: "<<id; 
     } 
}; 

class Sports : virtual public Student 
{ 
    int s_grade; 

    public: 
     Sports(string n, int a,int s):Student(n,a) {s_grade = s;} 
     void display() 
     { 
      cout<<"\nSports grade: "<<s_grade; 
     } 
}; 

class Exam: virtual public Student 
{ 
    int e_grade; 

    public: 
     Exam(string n, int a,int e):Student(n,a) {e_grade = e;} 
     void display() 
     { 
      cout<<"\Exam grade: "<<e_grade; 
     } 
}; 

class Results: public Sports, public Exam 
{ 
    string result; 

    public: 
     Results(string n,int i, int s, int e):Sports(n,i,s):Exam(n,i,e) {} 
     void display() 
     { 
      Student::display(); 
      Sports::display(); 
      Exam::display(); 
     } 
}; 

 Смежные вопросы

  • Нет связанных вопросов^_^