언어 공부/C++

다중 상속

세희홍 2022. 7. 4. 16:55

부모 클래스가 여러개인 경우. 두 이상의 클래스를 베이스 클래스로 파생클래스를 만드는 상속.

 

class DormStudent {
public:
	string building;
	int roomNumber;
	void Warn() {
		cout << "벌점\n";
	}
};
class UnderGradStudent {
public:
	string name;
	string dept;
	void Warn() {
		cout << "학사 경고\n";
	}
};
class UnderGrad_DormStudent : public DormStudent, public UnderGradStudent
{};

int main() {
	UnderGradStudent s1;
	UnderGrad_DormStudent s2;
	s1.Warn(); // 학사경고
	s2.Warn(); //에러. 
	s2.DormStudent::Warn(); // 벌점
	return 0;
}

UnderGrad_dormStudent는 DormStudent, UnderGradStudent에서 상속을 받아서 Warn()이 다중상속되었다. s2.Warn(); 이라고 하면 에러가 나고, s2.DormStudent::Warn();로 클래스 이름을 명시해야 한다. 


 

죽음의 다이아몬드

Person 클래스가 Student, Professor 클래스로 name을 상속한다. TA 클래스가 Student 클래스와 Professor 클래스를 상속받았으므로, name이라는 데이터 멤버의 중복이 발생한다. 

 

가상 베이스

class Person {...};
class Student: virtual public Person {...};
class professor: virtual public Person {...};
class TA: public Student, public Professor {...};

virtual 키워드를 붙인 가상 베이스 상속으로 중복된 데이터 멤버 문제 해결.

 

#ifndef PERSON_H
#define PERSON_H
#include <iostream>
#include <cassert>
using namespace std;

class Person
{
  protected: 
    string name;  // protected 데이터 멤버
  public:
    Person(string name);
    ~Person(); 
    void print();
};
#endif

공통 데이터 멤버인 name을 protected로 만들어서 모든 파생 클래스에서 접근할 수 있게 해야 하고, 위임이 있는 멤버 함수는 사용하지 않아야 한다.