상속이란 새로운 클래스가 기존의 클래스의 변수와 함수를 이용할 수 있게 하는 기능이다.

상속받는 새로운 클래스는 자식클래스라고 하고, 상속하는 기존의 클래스는 부모클래스라고 한다.


1
2
3
4
5
6
7
8
9
10
11
12
13
#pragma once
class point
{
protected:
    int x, y;
public:
    point();
    ~point();
 
    int name;
    virtual int collision(int x, int y) = 0;
};
 
cs

이런 point라는 클래스가 존재한다면


1
2
3
4
5
6
7
8
9
10
11
12
13
#include "point.h"
 
#pragma once
class rectangle : public point
{
private:
    int w, h;
public:
    rectangle();
    ~rectangle();
 
    int collision(int x, int y);
};
cs

point클래스를 상속받고 싶다면 

1. point 클래스의 헤더파일을 include한 뒤

2. 클래스 명 옆에 세미콜론(:)을 적고 뒤에 상속받을 클래스명을 적으면 상속이 된다.


상속을 받게되면 부모인 point에 속해있는 변수 및 함수. x, y, name, collision()을 전부 사용할 수 있게 된다.

이전 글에도 말했듯이 protected로 포함해둔 부분은 상속받은 자식이 사용할 수 있다. (private는 사용불가)




오버라이딩이란 부모가 정의해 둔 함수를 상속받아 재정의하여 사용하는 것을 말한다.

상속받은 자식이 함수의 내용을 바꿔쓰고싶다면 함수이름은 그대로두되 정의만 바꾸어 사용하면된다.


가상함수란 반환형 앞에 virtual을 붙여 함수를 가상함수로 만드는 것인데

상속받은 클래스에 오버라이딩한 같은 함수가 있다면 무조건 그 함수를 우선적으로 사용한다는 것이다.

1
2
3
4
5
6
7
8
9
class Parent{
public:
 void print(){ cout << "Parent" << endl;}
};
 
class Child : public Parent{
public:
 void print(){ cout << "Child" << endl;}
};
cs

위와 같이 클래스 2개가 존재하고 print 함수를 오버라이딩했다고 하자.


1
2
3
4
5
6
7
8
9
10
void main(){
Child* c = new Child;
c.print();
 
Parent* p = new Parent;
p.print();
 
Parent* pc = new Child;
pc.print();
}
cs

이 경우 Child, Parent, Parent가 출력된다.

이유는 pc는 Child지만 Parent형 포인터에 담았기 때문에 Parent로 인식되어 Parent의 print()가 실행된다.


1
2
3
4
class Parent{
public:
 virtual void print(){ cout << "Parent" << endl;}
} ;
cs

이런 경우에 부모의 함수를 가상함수로 만들면 3번째 경우에서도 무조건 자식의 print()가 불리게 된다.


1
2
3
4
class Parent{
public:
 virtual void print() = 0;
} ;
cs

가상함수를 선언시 위와 같이 순수가상함수로도 선언할 수 있는데, 

이 경우에는 부모에서 함수를 정의하지않고 무조건 상속받아서 재정의해서 사용하라는 뜻이다.

Posted by misty_
,