이번 시간에는 다중 상속에 대해서 알아보겠습니다.
#include <iostream>
class A
{
public:
int a;
A() { std::cout << "A class 생성자 호출" << std::endl; }
};
class B
{
public:
int b;
B() { std::cout << "B class 생성자 호출" << std::endl; }
};
class C : public A, public B // *******************
{
public:
int c;
C() { std::cout << "C class 생성자 호출" << std::endl; }
};
int main()
{
C c;
c.a = 10;
c.b = 20;
c.c = 30;
}
상속 순서에 따라서 생성자의 호출 순서도 변경된다.
class C : public A, public B 순서로 상속하는 경우
A class 생성자 호출
B class 생성자 호출
C class 생성자 호출
class C : public B, public A 순서로 상속하는 경우
B class 생성자 호출
A class 생성자 호출
C class 생성자 호출
다중 상속 주의할 점
1. 부모 클래스 간에 동일한 이름의 변수나 함수가 있다면 오류 발생한다.
2. 다이아몬드 상속이라 불리우는 부모 클래스들의 부모클래스가 같은 경우, virtual 키워드를 사용해서 상속을 해야 한다.
이러한 형태로 A를 virtual 로 상속 받는다면, D 에서 다중 상속 시에도, 컴파일러가 언제나 A 를 한 번만 포함하도록 지정할 수 있게 됩니다. 참고로, 가상 상속 시에, D 의 생성자에서 B 와 C 의 생성자뿐만 아니라, A 의 생성자도 호출해야한다.
class A {
public:
// ...
};
class B : public virtual A {
// ...
};
class C : public virtual A {
// ...
};
class D : public B, public C {
// ...
};
'C++' 카테고리의 다른 글
[C++] 추상 클래스 (abstract class) (0) | 2023.02.18 |
---|---|
[C++] 상속(inheritance) - up casting, virtual (0) | 2023.02.17 |
[C++] 상속(inheritance) - protected, private 키워드 (0) | 2023.02.16 |
[C++] 상속(inheritance) (0) | 2023.02.16 |
[C++] 포인터 - 연산자 오버로딩(overloading) (0) | 2023.02.14 |