언어 공부/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로 만들어서 모든 파생 클래스에서 접근할 수 있게 해야 하고, 위임이 있는 멤버 함수는 사용하지 않아야 한다.