2020. 6. 12. 20:13ㆍ프로그래밍/C++
다중 상속 시 생성자 호출 순서
파생 클래스에서 등장한 부모 클래스 순서대로 생성자 호출
초기화 리스트의 순서는 상관 없음
// Student(), Faculty() 순으로 호출
class TA : public Student, public Faculty
{
};
Java에서처럼 super()를 쓸 수 없는 이유 (부모 클래스의 생성자 호출)
다중 상속이 가능하기 때문
여러 클래스로부터 동시에 상속을 받을 수 있기 때문에 한 클래스만(super()) 부를 수 없음
다이아몬드 문제
class Animal
{
public:
virtual Walk();
};
class Tiger : public Animal
{
public:
virtual Walk();
};
class Lion : public Animal
{
public:
virtual Walk();
};
class Liger : public Tiger, public Lion
{
// ...
};
1. 어떤 함수가 호출될지 모호할 때는 우리가 직접 부모 클래스를 특정해줘야 함
myLiger->Walk(); // ??
myLiger->Tiger::Walk(); // OK
2. Liger 개체 만들면 Animal의 데이터가 두 번 생기는 문제점
가상 베이스 클래스 쓰면 됨
클래스 상속할 때 virtual 키워드 붙이면 다중 상속 받더라도 부모 클래스의 데이터가 하나만 있는 것을 보장
class Animal
{
public:
virtual Walk();
};
class Tiger : virtual public Animal
{
public:
virtual Walk();
};
class Lion : virtual public Animal
{
public:
virtual Walk();
};
class Liger : public Tiger, public Lion
{
// ...
};
다중 상속 최대한 쓰지 말자...
다중 상속 하려면 결국 헤더를 손봐야하는데
다중 상속 받겠다고 후임자가 나중에 virtual 붙이는 것도 웃기고
앞으로 태어날 혼종(?)을 위해 미리 virtual 붙이는 것도 웃기고
대신 인터페이스를 사용할 것
출처 : 포큐아카데미 C++ 언매니지드 프로그래밍
'프로그래밍 > C++' 카테고리의 다른 글
캐스팅(형변환, Casting) (0) | 2020.06.16 |
---|---|
추상 클래스 / 인터페이스 (0) | 2020.06.12 |
가상 함수 / 동적 바인딩 / 다형성 (0) | 2020.06.11 |
멤버 함수의 메모리 / 정적 바인딩 (0) | 2020.06.11 |
상속 / 생성자 소멸자 호출 순서 (0) | 2020.06.11 |