본문 바로가기

C++

[C++] 포함, private 상속, public 상속

상속은 클래스를 재활용하는 방법 중 하나이다.

상속 이외에도 클래스를 재활용하는 방법이 있다.

class Date
{
protected:
     int year,month,day;
public:
     Date(int y,int m,int d) { year=y;month=m;day=d; }
     void OutDate() { printf("%d/%d/%d",year,month,day); }
};

class Product
{
private:
     char Name[64];
     char Company[32];
     Date ValidTo;
     int Price;
public:
     Product(char *aN, char *aC, int y,int m,int d, int aP) : ValidTo(y,m,d) {
          strcpy(Name,aN);
          strcpy(Company,aC);
          Price=aP;
     }   
};

 

Product 클래스 내에 Date 클래스의 객체를 멤버로 선언한다. 이것을 포함이라고 한다.

포함을 할 때는 Product의 생성자의 초기화 리스트에 포함하는 객체 ValidTo의 생성자를 호출해 초기화해야한다.

 

Product(char *aN, char *aC, int y,int m,int d, int aP) {
          ValidTo=Date(y,m,d);
          strcpy(Name,aN);
          strcpy(Company,aC);
          Price=aP;
     }

위와 같이 초기화리스트가 아니라 생성자에서 대입문을 작성하면 ValidTo 객체가 생성되면서 초기화되는 것이 아니라 

디폴트 생성자에 의해 쓰레기 값을 갖고 있다가 임시적으로 만들어진 객체 Date가 validTo에 대입되는 연산과정을 거치기 때문에 그냥 초기화 리스트를 쓰자.

 

class Product : private Date
{
private:
     char Name[64];
     char Company[32];
     int Price;
public:
    Product(char *aN, char *aC, int y,int m,int d, int aP) : Date(y,m,d) {
          strcpy(Name,aN);
          strcpy(Company,aC);
          Price=aP;
     }
}

private 상속은 포함이 여러개의 객체를 포함할 수 있는 반면에 한개의 Date만 재활용이 가능하다. 그래서 상황에 따라 여러개의 Date가 필요하면 포함으로, 하나만 필요하다면 private 상속을 사용하면 된다.

 

포함, private 상속과 public 상속의 가장 큰 차이점은 public 상속은 인터페이스까지 상속한다는 것이다. 인터페이스 상속은 스스로 멤버함수를 갖진 않지만 그 함수를 호출 할 수 있는 것이다. 인터페이스란 클래스의 공개된 기능(함수)이다. 

private 상속은 상속받은 멤버와 함수를 모두 숨겨버리지만 public 상속은 상속받은 public 함수를 자식 클래스에 물려줄수도 있고 외부에서 호출할 수도 있기 때문에 인터페이스 상속이다. 

'C++' 카테고리의 다른 글

[C++] 순수 가상 함수  (0) 2022.01.06
[C++] 가상 함수, 가상 파괴자  (0) 2022.01.05
[C++] 다중 상속과 virtual 클래스  (0) 2022.01.05
[C++] 상속받은 멤버 초기화  (0) 2022.01.05
[C++] 복사 생성자  (0) 2022.01.04