inheritance __ 상속

😎·2022년 12월 22일
0

CPP

목록 보기
24/46

inheritance __ 상속

Cat classPony class가 있다. 두 클래스는 같은 멤버 변수인 _numberOfLegs 와 같은 멤버 함수인 run(int distance) 가 있다. 그리고 다른 멤버 함수를 각각 하나씩 갖고 있다.

#include <iostream>

class Cat
{
    private:
     int _numberOfLegs; // 중복

    public:
     Cat();
     Cat(Cat const &);
     Cat &operator=(const Cat &);
     ~Cat();

     void run(int distance); // 중복

     void scornSameone(const std::string &target);
};

class Pony
{
    private:
     int _numberOfLegs; // 중복

    public:
     Pony(void);
     Pony(const Pony &src);
     virtual ~Pony(void);
     Pony &operator=(const Pony &rhs);

     void run(int distance); // 중복

     void doMagic(const std::string &target);
};

이때, Dog, Rabbit 같은 클래스를 새로 만들게 된다면, 매번 중복되는 _numberOfLegs 변수와 run 함수를 만들어야한다는 것이다.

이러한 중복을 모아서 Animal class를 만드는 건 어떨까? Animal class를 만들어서 중복됐던 멤버 함수와 멤버 변수를 넣자.
그 후 Cat classPony class 뒤에 : public Animal 을 입력하여 동물 클래스의 멤버 변수와 함수를 전달 받아 사용할 수 있게 할 수 있다.

#include <iostream>

// Animal 클래스 생성
class Animal {
 private:
  int _numberOfLegs;

 public:
	...

  void run(int distance);
};

// : public Animal 로 Animal 클래스를 생속 받음
class Cat : public Animal {
 public:
  Cat();
  Cat(Cat const &);
  Cat &operator=(const Cat &);
  ~Cat();

  void scornSameone(const std::string &target);
};

// : public Animal 로 Animal 클래스를 생속 받음
class Pony : public Animal {
 public:
  Pony(void);
  Pony(const Pony &src);
  virtual ~Pony(void);
  Pony &operator=(const Pony &rhs);

  void doMagic(const std::string &target);
	// 부모에 같은 이름이 있지만 재정의
  void run(int distance);
};

이러한 것을 상속이라고 하고 Animal class부모, 전달 받아 사용하는 클래스를 자식이라 한다.

부모 클래스에 run 함수가 있더라도, 자식 클래스에서 같은 이름으로 재정의하여 다른 기능으로 사용할 수 있다.


protected

캡슐화 단계 중 하나이다. public 은 어디서나 접근 가능하고, private 은 오직 본인 클래스 객체에서만 가능하다. 하지만 protected 는 본인 클래스 객체에서 또는 자식 클래스의 객체에서 접근 가능하다.

#include <string>

class Animal // name, run(), legs 에 접근 가능
{
    private:
     std::string name; // Animal 객체에서마 접근 가능

    protected:
     Leg legs[4]; // Animal 과 자식 객체에서 접근 가능

    public:
     void run(); // 어디서나 접근 가능
};

class Dog : public Animal // run(), legs 접근 가능
{

};

int main() // run() 만 접근 가능
{

}

ETC.

이 외에도 다중 상속, 다이아몬드 상속 등 다른 많은 개념이 있는 것 같다. 차근 차근 프로젝트를 진행하면서 정리해보자.

profile
jaekim

0개의 댓글