C++ - 다중 상속

mohadang·2022년 9월 24일
0

C++

목록 보기
9/48
post-thumbnail

다중 상속에서의 부모 생성자 호출 순서

class Faculty
{};
class Student
{};

  • class TA : public Student, public Faculty
    • Student, Faculty 순서로 호출
  • class TA : public Student, public Faculty : Faculty(), Student()
    • 초기화 리스트 생성 순서와 상관 없음
  • Java에서처럼 super()로 부모 생성자 호출 못하는 이유는 다중 상속 때문이다.
    • 어떤 부모 생성자를 호출 할지 결정 할 수 없음

다중 상속의 단점

  • 어떤 함수 호출
class Faculty
{
public:
  void DisplayData();
};
class Student
{
public:
  void DisplayData();
};

class TA : public Faculty, public Student
{
};

// 어떤 함수 호출???
// 호출 못함...
TA* ta = new TA();
ta->DisplayData()
  • 해결책
// 부모 클래스 지정해 주어야 함
// 지저분함, 복잡함
ta->Student::DisplayData();
  • 다이아몬드 문제
class Animal
{
  void Move();
}
class Tiger : public Animal;
class Lion : public Animal;
class Liger : public Tiger, public Lion
{
  void Method()
  {
    Move();// Tiger ??, Lion??으로 부터 Move를 각각 상속 받는데 어떤것???
  }
}

// Liger 클래스 안에는 Animal 클래스 레이아웃이 몇개 있을 까??
// 2개, Tiger로부터, Lion으로 부터 하나씩...
  • 해결책
// 가상 베이스 클래스
// virtual 상속, 이렇게 상속하면 Liger로 부터 Animal을 한번만 상속 받게 된다.
class Tiger : virtual public Animal;
class Lion : virtual public Animal;
class Liger : public Tiger, public Lion;
  • 다중 상속을 최대한 쓰지 말자, 대신 인터페이스를 사용하자
class AAA
{
public:
  virtual void String1() = 0;
};
class BBB : public AAA
{
public:
  void String2() { cout << "BBB" << endl; }
};
class CCC : public AAA
{
public:
  void String3() { cout << "CCC" << endl; }
};
class DDD : public BBB, public CCC, public AAA
{
public:
  virtual void String1()
  {
    cout << "AAA" << endl;
  }
  void ShowString()
  {
    String1();
    String2();
    String3();
  }
};

AAA* a = new DDD;
a->String1();
profile
mohadang

0개의 댓글