c++ 상속 공부중에서 이해가 가지 않는것이 있습니다.
#include
using namespace std;
class A
{
public:
A() { cout << "A 생성자 호출" << endl; }
~A() { cout << "A 소멸자 호출" << endl; }
};
class B : public A
{
public:
B() { cout << "B 생성자 호출" << endl; }
~B() { cout << "B 소멸자 호출" << endl; }
};
class C : public A
{
public:
C() { cout << "C 생성자 호출" << endl; }
~C() { cout << "C 소멸자 호출" << endl; }
};
class D : public B, public C
{
public:
D() { cout << "D 생성자 호출" << endl; }
~D() { cout << "D 소멸자 호출" << endl; }
};
int main()
{
D Test;
return 0;
}
이러한 예를 실행한 결과
A 생성자 호출
B 생성자 호출
A 생성자 호출
C 생성자 호출
D 생성자 호출
D 소멸자 호출
C 소멸자 호출
A 소멸자 호출
B 소멸자 호출
A 소멸자 호출
이런 결과가 나왔는데 A 클래스가 여러번 생성/소멸자를 호출하더군요 저는 상속때문이라 생각했지만 D 클래스에서도 B, C를 상속받지만 여러번 호출되지 않는게 궁금합니다.
왜 그런건가요 ??
저걸 죽음의 다이아몬드라고 합니다. 저런 상속은
저걸 죽음의 다이아몬드라고 합니다. 저런 상속은 이용하지 않으시는것을 추천합니다. 다음 문서도 읽어보세요
http://stackoverflow.com/questions/419943/virtual-inheritance
와우 감사합니다!
이런 문제가 '죽음의 다이아몬드' 라고 하는군요 ? 좋은글 볼수 있었습니다 감사합니다 !!
OOP가 어려운 이유는 문법이 새로워서가 아니라
OOP가 어려운 이유는 문법이 새로워서가 아니라 패러다임(생각하는 방법)이 새로워서 입니다.
유니콘은 흔히 말과 새가 합쳐졌다고 말하지만, 실은 말의 외형에 새의 날개가 붙여진 형태지요.
따지자면 유니콘은 말의 한 종류(class)도 아니며, 새의 한 종류도 아닙니다.
말과 새를 상속받아서 유니콘을 만들면, 다리 두쌍과 날개 한쌍만 정상적이지,
말머리 새머리가 붙어있는데다 말심장 새심장 등 온갖 내장을 다 가지고 있는 기형적인 생물이 되겠지요.
같은 종류(class)면 몰라도, 전혀 다른 종류(class)에 대한 상속은 행동 또는 특징 또는 속성만을 이용해서 하고,
구체적인 구현은 내부적인 선언을 이용하는게 올바른 사용법입니다.
class Unicorn : public Legged, public Winged
{
looklike() { return Horse().looklike(); }
}
와우!!!
좋은 정보 감사합니다!!
댓글 달기