2014-10-19 4 views
0

이것은 다음 문항입니다.파생 클래스의 생성자를 정의하여 두 기본 클래스의 개인 데이터 멤버를 인스턴스화하는 방법은 무엇입니까?

foll을 사용하여 Student라는 기본 클래스를 설계하십시오. 2 필드 : - (i) 이름 (ii) 이드. 학생 기본 수업에서 스포츠 및 시험이라는 두 클래스 을 파생시킵니다. Class Sports에는 s_grade라는 필드가 있고 클래스 Exam에는 정수 필드 인 e_grade라는 필드가 있습니다. 스포츠 및 시험을 상속받은 결과 이라는 클래스를 파생시킵니다. 이 클래스에는 문자 배열 또는 문자열 필드가있어서 최종 결과를 나타냅니다. 또한 최종 결과를 표시하는 데 사용할 수있는 display라는 멤버 함수가 있습니다. 메인 클래스에서 이러한 클래스의 사용법을 설명하십시오.

#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. 문자열을 const 참조로 전달하십시오. 2. 초기화 목록을 사용하십시오. 3. 무엇이 문제인가 –

+1

'Students :: display();에 대한 호출은 애매하기 때문에 컴파일해서는 안됩니다 :'Results' 클래스는'Student'의 인스턴스 두 개를 포함합니다 - 하나는'Sports'를 통해, 다른 하나는' 하나는 '시험'이다. – cdhowie

+0

@cdhowie 나는 이제 '학생'을 상속하기 위해 가상의 상속을 사용했다. 아직 컴파일되지 않습니다. 어떻게해야합니까? –

답변

3

학생 클래스는 가상이어야합니다. 다른 현명한 결과에는 두 명의 학생 회원이있을 것입니다. 그것은 모호함을 가져올 것입니다.

+0

댓글에 답글이 있어도 +1하십시오. –

+0

클래스는 가상 일 수 없습니다. 사실상 Student 클래스를 상속 받아야한다고 가정합니다. – cdhowie

+0

그래, 그 cdhowie 뜻. 인도의 선생님은 하이브리드 상속에서 기본 클래스가 사실임을 가르쳐줍니다. –

1

학생용 스포츠 및 시험을 파생 할 때 가상 상속을 사용해야합니다. 이렇게하면 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(); 
     } 
}; 
관련 문제