티스토리 뷰

1. 오버라이딩

- 오버라이딩은 파생 클래스에서 기본 클래스에 작성된 가상 함수를 중복 작성하여 기본 클래스에 작성된 가상 함수를 무력화시키고, 객체의 주인 노릇을 하는 것입니다.

기본 클래스의 포인터를 이용하든 파생 클래스의 포인터를 이용하든 가상 함수를 호출하면, 파생 클래스에 오버라이딩된 함수가 항상 실행됩니다.


2. 가상함수

- 가상 함수랑 virtual 키워드로 선언된 멤버 함수입니다.

virtual은 컴파일러에게 자신에 대한 호출 바인딩을 실행 시간까지 미루도록 지시하는 키워드입니다.

가상 함수는 기본 클래스나 파생 클래스 어디에서나 선언될 수 있습니다.

- 순수 가상 함수란 함수의 코드가 없고 선언만 있는 가상함수를 일컫습니다.

순수 가상 함수는 멤버 함수의 원형 뒤에 =0;으로 선언합니다.

ex)

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

- 추상 클래스는 순수 가상 함수를 가진 클래스입니다.


3. 동적바인딩(업캐스팅이 일어날 때 발생)

- 동적바인딩이란 실행 시간 바인딩 혹은 늦은 바인딩이라고도 불립니다.

가상 함수를 호출하는 코드를 컴파일 할 때, 컴파일러는 바인딩을 실행 시간에 결정하도록 미루어둡니다. 나중에 가상 함수가 호출되면, 실행 중에 객체 내에 오버라이딩된 가상 함수를 동적으로 찾아 호출합니다. 이 과정을 동적 바인딩이라 합니다.

- 동적 바인딩은 기본 클래스의 객체에 대해서는 가상 함수가 호출된다고 하더라도 동적 바인딩은 일어나지 않습니다.

이유는 객체 내에 오버라이딩된 가상 함수가 없기 때문입니다.

동적바인딩은 파생 클래스의 객체에 대해, 기본 클래스의 포인터로 가상 함수가 호출될 때 일어납니다.


예제 10-1 제네릭 myswap() 함수 만들기 (교수님께서 블로그에 쓰라고는 안하신 부분)

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
#include <iostream>
using namespace std;
 
class Circle {
      int radius;
public:
       Circle(int radius=1) { this->radius = radius; }
       int getRadius() { return radius;}
};
 
template <class T>
void myswap(T & a, T & b) {
     T tmp;
     tmp = a;
     a = b;
     b = tmp;
}
 
int main() {
    int a = 4, b = 5;
    myswap(a, b);
    cout << "a=" << a << ", " << "b=" << b << endl;
    
    double c = 0.3, d = 12.5;
    myswap(c, d);
    cout << "c=" << c << ", " << "d=" << d << endl;
    
    Circle donut(5), pizza(20);
    myswap(donut, pizza);
    cout << "donut반지름=" << donut.getRadius() << ", ";
    cout << "pizza반지름=" << pizza.getRadius() << endl
    system("pause");
}
 
cs

예제 10-9 vector 컨테이너 활용 (교수님께서 블로그에 쓰라고는 안하신 부분)
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
#include <iostream>
#include <vector>
using namespace std;
 
 
int main() {
    vector<int> v;
    
    v.push_back(1);
    v.push_back(2);
    v.push_back(3);
    
    for(int i = 0; i < v.size(); i++)
            cout << v[i] << " ";
    cout << endl;
    
    v[0= 10;
    int m = v[2];
    v.at(2= 5;
    
    for(int i = 0; i < v.size(); i++)
            cout << v[i] << " ";
    cout << endl;
 
    system("pause");
}
 
cs

예제 10-12 sort() 함수를 이용한 vector 소팅 (교수님께서 블로그에 쓰라고는 안하신 부분)
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
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
 
 
int main() {
    vector<int> v;
    
    cout << "5개의 정수를 입력하세요>> ";
    for(int i = 0; i < 5; i++) {
            int n;
            cin >> n;
            v.push_back(n);
    }
    
    sort(v.begin(), v.end());
    
    vector<int>::iterator it;
    
    for(it = v.begin(); it != v.end(); it++)
           cout << *it << ' ';
    cout << endl;
 
    system("pause");
}
 
cs


'객체지향 프로그래밍' 카테고리의 다른 글

7. 상속  (0) 2016.11.15
6. 함수중복과 static멤버  (0) 2016.11.11
5. 함수와 참조 , 복사생성자  (0) 2016.11.04
4. 객체포인터와 객체배열, 객체의 동적생성  (0) 2016.10.11
3. 클래스와 객체  (0) 2016.09.20
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/05   »
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
글 보관함