티스토리 뷰

1. 오버라이딩의 개념
함수 오버라이딩(function overriding)
- 파생 클래스에서 기본 클래스의 가상 함수와 동일한 이름의 함수 선언한다.
- 기본 클래스의 가상 함수의 존재감 상실한다.
- 파생 클래스에서 오버라이딩한 함수가 호출되도록 동적 바인딩한다.
- 함수 재정의라고도 부른다.
- 다형성의 한 종류

 

2. 가상함수, 추상클래스의 예

가상 함수(virtual function)
- virtual 키워드로 선언된 멤버 함수
- virtual 키워드는 동적 바인딩 지시어이다.
- 컴파일러에게 함수에 대한 호출 바인딩을 실행 시간까지 미루도록 지시한다.

- 오버라이딩, 함수 중복을 할 떄 사용 된다.

 

순수 가상 함수

- 함수의 코드가 없고 선언만 있는 가상 멤버 함수

- 순수 가상함수가 있는 클래스를 추상클래스라고 부른다.

- 추상클래스를 상속받으면 반드시 순수 가상 함수를 구현해야만한다.

 

*순수 가상 함수 사용 형식

class Shape {//순수 가상 함수를 포함하고 있는 클래스를 추상클래스라고 부른다.
 public:
  //가상 함수 선언
  virtual void draw() = 0; //순수 가상함수 ㅣ 구현 코드없고 선언만 하는 함수
 };

 

3. 동적바인딩 개념정리

- 기본 클래스에 대한 포인터로 가상 함수를 호출하는 경우(업캐스팅)
- 동적바인딩은 업캐스팅된 포인터로 오버라이딩된 파생클래스의 함수를 실행하도록 보장해준다.

 

<위 세개 주제 예제>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#include<iostream>
using namespace std;
class Shape {//순수 가상 함수를 포함하고 있는 클래스를 추상크래스라고 부른다.
public:
    //가상 함수 선언
    virtual void draw() = 0//순수 가상함수 ㅣ 구현 코드없고 선언만 하는 함수
};
 
class Circle : public Shape { 
    //이 클래스는 추상클래스인 shape을 상속받았으므로, 반드시 순수가상함수인 draw()를 구현해야 한다.
public:
    virtual void draw() { cout << "Circle을 그린다." << endl; }
};
 
class Rect : public Shape {
public:
    virtual void draw() { cout << "Rect을 그린다." << endl; }
};
 
class Line : public Shape {
public:
    virtual void draw() { cout << "Line을 그린다." << endl; }
};
int main() {
    //Shape *pShape = new Shape();
    //pShape은 Shape 클래스의 포인터이다.
    //pShape->draw(); //Shape을 그린다.
 
 
    //동적바인딩은 업캐스팅된 포인터로 오버라이딩된 파생클래스의 함수를 실행하도록 보장해준다.
    Shape *pShape = new Circle();//업캐스팅
    pShape->draw(); //Circle을 그린다. 함수중복(오버라이딩)되어 있는 걸 실행한다. 동적바인딩.
 
    pShape = new Rect();
    pShape->draw();
    
    pShape = new Line();
    pShape->draw();
 
    return 0;
}
 
cs
댓글