다중 상속에서의 부모 생성자 호출 순서
class Faculty
{};
class Student
{};
class TA : public Student, public 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();