Cat class
와 Pony 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 class
와 Pony 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 함수가 있더라도, 자식 클래스에서 같은 이름으로 재정의하여 다른 기능으로 사용할 수 있다.
캡슐화 단계 중 하나이다. 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() 만 접근 가능
{
}
이 외에도 다중 상속, 다이아몬드 상속 등 다른 많은 개념이 있는 것 같다. 차근 차근 프로젝트를 진행하면서 정리해보자.