home..

Cpp03

상속과 다형성에 대해서 연습하는 CPP03에 대한 내용 정리.

Table of contents

상속과 접근제한자

원, 직사각형, 삼각형을 모델링하기 위해 클래스를 정의하였다고 할 때, 이들 클래스는 꼭짓점, 색상, 색이 비었는지의 여부 등 많은 공통적인 기능을 갖는다. 하나의 클래스를 선언할 때마다 일일히 비슷한 기능을 하는 함수들을 선언해줄 필요 없이, 이들 공통적 기능의 중복성을 제거하여 각각을 설계하는 가장 좋은 방법은 상속(inheritance)를 사용하는 것이다. C++에서의 상속은 아래와 같은 코드를 통해 이루어진다.

class A {
    //..
}
class B : 접근제한자 A
{
    //..
}

이럴 경우에는 B라는 클래스에서는 A라는 클래스를 상속받게 되어, A의 멤버함수들을 쓸 수 있게 된다.

접근제한자란?

여기서 접근제한자는 public, private, protected 세가지의 키워드를 말한다. c의 구조체에서도 쓰듯이, public의 영역에 있는 변수 및 함수들은 외부에서도 접근할 수 있는 반면 private의 영역에 있는 변수/함수들은 외부에서 접근이 불가능하고 오로지 내부함수에 의해서만 다루어질 수 있다. 여기서 기존에는 보이지 않았던 protected라는 키워드가 나오는데, 이 영역에 선언된 멤버 변수/함수들은 외부에서는 접근이 불가능하지만, 파생 클래스에서는 접근이 가능하다.

접근제한자에 따른 상속

  1. private 상속 : 부모 클래스에서 private보다 접근 범위가 큰 public, protected 영역에 있는 멤버들을 전부 private으로 바꿔 상속하는 것.
  2. protected 상속 : private과 protected 멤버들은 그대로지만, 접근 범위가 큰 public 멤버는 protected 멤버로 바뀐다.
  3. public 상속 : public보다 접근 범위가 넓은 접근제한자는 없으므로 멤버들은 모두 그대로 상속된다. 즉, 자식이 부모의 멤버 중 쓰고싶은 게 있다면 protected나 public의 접근 범위를 가져야 한다.

가상 상속에 관해

C++에서는 다중 상속을 지원한다. 다중상속은 장점도 있는 반면, 단점도 있다. 대표적으로, 상속성을 높여 더욱 유연하고 효율적인 코드를 짤 수 있다는 게 장점인 반면, 그와 동시에 하나의 클래스가 다른 클래스에 상속이 되고, 서로 꼬리에 꼬리를 무는 뫼비우스의 띠 같은 다이아몬드 상속구조를 가질 수도 있다는 것이다. 이는 메모리 낭비와 성능 저하로 이어지기 때문에 각별한 주의가 필요하다.
이런 다이아몬드 상속의 구조를 띄게 될 경우, 데이터의 중복과 불필요한 생성자 호출을 막기 위해 virtual inheritance(가상 상속)을 사용한다.
가상 상속을 하게 될 경우 vbptr(virtual base table pointer)이라는 offset을 가르키는 포인터가 생성되며, virtual로 상속된 클래스는 메모리 구조에서 제일 아래로 가게 된다.
시작 offset은 0이 될 수도 있고 음수도 될 수 있다. 가상 상속은 기존 데이터 크기보다 더 커질 수 있으며, 성능 저하를 야기할 수 있다.

출처: https://hwan-shell.tistory.com/224






© 2023 objectio   •  Powered by Soopr   •  Theme  Moonwalk