모던C++/상속관계 Inheritance

결론: 사용하지 마세요 Dynamic Cast: RTTI (RunTime Type Information) 을 사용하는 것인데 대부분의 C++ 프로젝트에선 사용을 금지하고 있다. 구글 C++ 스타일 가이드의 RTTI 파트를 보면, Avoid using Run Time Type Information 부분에서 Dynamic Cast를 사용하지 말 것을 주문하고 있다. 이 접근 자체가 클래스 구조를 잘못 짠 것이고, 이런 RTTI가 없는 코드가 유지보수가 쉬운 코드라는 것이다. https://google.github.io/styleguide/cppguide.html Google C++ Style Guide Google C++ Style Guide Background C++ is one of the main de..
일반 상속과 가상 상속 오브젝트의 구조 다이아몬스 상속의 해결방법인 Virtual Inheritance 가상 상속의 구조에 대해 알아보자. 이전 게시글에서 언급했던 다이아몬드 상속의 구조이다. 간단하게 이전 게시글에서 마지막에 언급했던 다이아몬드 상속의 내용을 다시 정리해 보면, 위 (그림1)과 같은 구조를 갖는 Liger 오브젝트를 생성할 때 virtual 키워드 없이 오브젝트를 생성하면 Animal Constructor가 2번 중복되어 호출된다는 것이다. virtual 키워드를 사용해서 Liger 오브젝트를 호출하면 Animal Contructor가 1번만 호출된다. 그렇다면 virtual 키워드를 붙여서 inheritance를 만들 때 일반적인 상속과 어떤 차이점이 있을까? 앞서 virtual fu..
다중 상속 Multiple Inheritance란? 지금까지는 Base Class가 1개인, Linear 상속 함수만을 다뤘다. Base Class를 사자와 호랑이 두 개를 만들고 두 클래스를 모두 상속 받게 되면 사자와 호랑이의 혼종인 라이거 클래스를 만들 수 있는 것이 바로 다중 상속이다. Lion, Tiger base class 를 만들고 두 개를 동시에 상속받아서 Liger derived class를 만들어 보자. 1) 컨스트럭터와 디스트럭터의 실행 순서는? 만약 다중상속 받을 때 상속의 순서에서 Tiger를 만저 써주게 되면 컨스트럭터의 순서도 바뀌게 된다. 2) 다중 상속시 오브젝트의 사이즈 각각 speak() 함수를 만들고 실행해보면 각각에 맞는 컨스트럭터가 불려진 후에 Liger! 외치게 ..
결론 (1) 인터페이스 클래스를 생성할 때는, base class에서 pure virtual function을 사용할 것. (2) 인터페이스 클래스 생성 시, 멤버 변수를 정의하지 말 것. (3) pure virtual function을 사용했다면 반드시 override 해 줄 것! Pure virtual function 순수 가상 함수, abstact class 추상 클래스란? pure virtual function: 함수 implementation, 즉 정의 부분이 없는 가상 함수를 말한다. C++에서는 밑의 형태와 같이 사용할 수 있다. 선언 : Pure virtual function = 0; 이 Pure virtual function을 하나라도 가지고 있는 함수를 abstract 추상 함수라고 한..
상속 관계에서 Dynamic Polymorphism을 만드는 virtual function, virtual table 에 대해 알아보자. 예제1) double 사이즈는 8byte이므로, 상속받은 cat의 사이즈는 16byte. (double 변수 2개) Dynamic Polymorphism을 구현하기 위해서 speak 함수에 virtual을 넣어주고 derived 클래스에 override를 넣어주게 되면 사이즈가 바뀐다! 그 이유는, address 주소 정보가 추가로 들어가기 때문이다. Base 클래스인 Animal 의 경우, double 타입의 height 정보를 가지고 있어서 8 byte, Cat 의 경우 Base 클래스의 height 정보와 Cat 클래스만의 double 타입 weight 정보까지 ..
Virtual Function 가상 함수 : C++ 에서 가상 함수는 파생 클래스에서 재정의할 것으로 기대되는 멤버 함수를 의미한다. 이러한 가상 함수는 자신을 호출하는 객체의 동적 타입에 따라 실제 호출할 함수가 결정된다. *Base 클래스에서 virtual 키워드를 사용해 가상 함수를 선언하면, 파생 클래스에서 재정의된 멤버 함수도 자동으로 가상 함수가 된다. 내용 정리 1) 모든 상속의 관계에서는 베이스 클래스의 컨스트럭터가 가장 먼저 실행되고, 베이스 클래스의 디스트럭터가 가장 마지막에 실행되어야 한다. 2) Base class의 Destructor는 무조건 virtual public, 또는 protected로 선언되어야 한다. 3) C++ 에서 다이나믹 폴리모피즘을 만드는 방법은, 클래스 간에 ..
이전 글에서 정확히 이어지는 내용이다. : https://nybot-house.tistory.com/58 1. Public, Private : Public, Private 개념은 익숙하겠지만 다시 한번 정리하면, 1) 외부에서 public 함수 변수에 접근 가능하지만 2) 외부에서 직접적으로 private으로는 접근이 불가능하다. 3) private에 직접 접근하고 싶다면 public 함수를 통해서 접근이 가능하다. (예시) Base 클래스에 private int pri, pubic에 void setPRI(int n) 을 두고 1) private 멤버인 pri에 직접적으로 접근을 할 경우에 접근 불가능. 2) base.setPRI(10) 처럼 public member function으로 접근하면 가능. ..
1. Inheritance 상속 : C++에서 상속이란, 기존에 정의되어 있는 클래스의 모든 멤버 변수와 멤버 함수를 물려받아 새로운 클래스를 작성하는 것을 말한다. 이 때, 기존에 정의되어 있던 클래스를 기초 클래스(base class) 또는 부모 클래스(parent class), 상위 클래스(super class)라고도 한다. 그리고 상속을 통해 새롭게 작성되는 클래스를 파생 클래스(derived class) 또는 자식 클래스(child class), 하위 클래스(sub class)라고 한다. 2. Inheritance 상속을 사용하는 이유? 1) Class relationship - 클래스 간의 관계를 설정할 때 주로 사용한다. : Animal 클래스가 있을 때, 이 동물 클래스를 상속받아서 Cat..
HeadlessCreator
'모던C++/상속관계 Inheritance' 카테고리의 글 목록