(C++)11장 상속성과 다형성

철수와 영희 클래스가 person클래스로 부터 상속 받는다고 치면 Person클래스를 상위클래스라하고 철수,영희 클래스를 하위 클래스라 한다.
이때, 상위 클래스의 멤버들은 접근 지정자오 관계없이 모두 하위 클래스가 똑같이 상속받는다.
Person클래스를 상속받은 Chulsoo클래스는 private멤버변수인 age도 상속 받을 수 있다.

1.2 클래스 상속 문법 이해

#include<iostream>
using namespace std;

#define NAME_LEN 20

class Person
{
 private:
  int age;
  char name[NAME_LEN];

 public:
  Person(char* name,int age)
 {
  strcpy_s(this->name,name);
  this->age=age;
  cout<<"Person::Person(name,age) 생성자 완료<<endl;
 }
~Person()
{
 cout<<"Person::~Person() 소멸자 완료"<<endl;
}
void introduce()
{
 cout<<"Person의 이름:"<<endl;
 cout<<"Person의 나이:"<<endl;
}
void eat();
void sleep();
};

class Chulsoo:public Person
{
 private:
   int numOfBooks;
 public:
   Chulsoo(char* name,int age,int numOfBooks):Person(name,age)
{
 this->numOfBooks=numOfBooks;
 cout<<"Chulsoo::Chulsoo(name,age,numOfBooks) 생성자 완료"<<endl;
}

 ~Chulsoo()
{
 cout<<"Chulsoo::~Chulsoo() 소멸자 완료"<<endl;
}

};

->>>>하위클래스에서 객체를 생성하면 상위클래스의 생성자를 호출하고 그 다음 하위클래스의 생성자가 생성된다. 반대로 소멸자는 하위클래스에서 먼저 소멸되고 상위클래스가 소멸 된다.

1.3 클래스 간 상속관계

Is-A관계: B(하위클래스)는 A(상위클래스)의 한 종류이다.
Has-A관계: A(상위클래스)는 B(하위클래스)를 가진다.

예제) Is-A관계는 "B는 A의 한 종류이다"를 만족하는 관계. 앞에서 Person과 Chulsoo는 철수는 사람이다를 만족하므로 Is-A관계이다. 그리고 사람은 철수이다는 만족하지 않으므로 상위클래스는 Person이고 하위클래스는 Chulsoo이다.

Has-A관계는 A,B 두 클래스에서 "A는 B를 가진다"를 만족하는 관계를 의미한다.예를 들어, 사람은 철수를 가진다 혹은 철수는 사람을 가진다. 등으로 표현되지 않는다. 즉 Person과 Chulsoo클래스는 Has-A관계를 가지지 않는다.

하지만 시계(Watch)클래스가 있다고 가정하면 "철수는 시계를 가진다."등으로 표현 할 수 있다.즉, Chulsoo와 Watch클래스는 Has-A관계가 성립한다.

예)
class Watch
{
 private:
   int price;
 public:
  Watch(){}
  ~Watch(){}
 void howMuch(){}
};

class Chulsoo
{
 private:
  int numOfBooks;
  Watch watch;
 public:
  Chulsoo(){}
  ~Chulsoo(){}
  void write(){}
}

----->>>>Has-A관계는 Is-A관계와 다르게 제약이 있을 수 있다. 시계뿐만 아니라 목걸이 반지등을 가진다고 하면 다중상속이 된다. 다중상속은 복잡해지므로 일반적으로 Has-A관계는 멤버변수로 클래스형을 가지도록 한다.


2. 상속의 접근 범위

상속받는 문법에서 접근 지정자(private,protected,public)에 대해 파악해보자

예)
class Person
{
 private:
   int agePrivate;
 protected:
  int ageProtected;
 public:
  int agePublic;

  Person(int age):agePrivate(age), ageProtected(age), agePublic(age)
{


}
~Person(){}

};


class Chulsoo:public Person
{
private:
 int numOfBooks;
public:
  Chulsoo(int age,int numOfBooks):Person(age),numOfBooks(numOfBooks)
{


}
~Chulsoo()
{


}
void introduce()
{
 //cout<<"agePrivate:"<<agePrivate<<endl;
  cout<<"ageProtected:"<<ageProtected<<endl;
  cout<<"agePublic: "<<agePublic<<endl;

}
}

--------->protected와 public멤버 변수에 모두 접근 하였다.

2.1 클래스 상속의 세가지 형태

세 가지 클래스 상속에는 (private,protected, public)

***public 상속***
Chulsoo클래스에서 Person클래스를 public으로 상속 받으므로, Person클래스의 세 가지 멤버 모두 접근 지정자를 그대로 유지한다. 하지만 Private멤버는 Chulsoo클래스에서 접근 할 수 없다. Chulsoo클래스를 Chulsoo1클래스에서 public 상속받으면 protected,public멤버만 남게 되고 이는 public상속이 그대로 유지된다.


***protected상속***
Chulsoo클래스가 Person클래스를 Protected로 상속 받으므로 Person클래스의 세가지 멤버 중 public멤버는 protected멤버로 변경되서 상속받는다. 또한, Person클래스의 private멤버는 Chulsoo클래스에 접근 할 수 없다.
Chulsoo클래스를 Chulsoo1클래스에서 상속받으면 기존 Person클래스의 private멤버는 접근 할 수 없고 남은 protected멤버 2개는 protected상속이므로 그대로 유지된다.

***private 상속***
Chulsoo클래스가 Person클래스를 private으로 상속받으므로, Person클래스의 세 가지 멤버 중 protected, public멤버는 private멤버로 변경되서 상속받는다. 또한,Person클래스의 private멤버는 Chulsoo클래스에서 접근 할 수 없다.
연달아서 Chulsoo클래스를 Chulsoo1클래스에서 private 상속받으면 기존 Person클래스의 Private멤버는 이미 Chulsoo클래스에서 접근 할 수없다고 치고, 남은 private멤버2개는 private상속이므로 그대로 유지된다. 다만, Chulsoo1클래스에서 멤버2개가 상위클래스인Chulsoo클래스의 private멤버이므로 접근 할 수 없다.



댓글

이 블로그의 인기 게시물

(네트워크)폴링방식 vs 롱 폴링방식

(ElasticSearch) 결과에서 순서 정렬

(18장) WebSocekt과 STOMP를 사용하여 메시징하기