ref:http://blog.naver.com/sea5727/220952601205


상속과 virtual함수


C++에서의 상속과 virtual 함수의 개념을 파악하기 위한 좋은 예제 소스입니다.


기본 소스 개념 : Animal을 상속받는 Cat과 Dog클래스와 내부 함수 설명 


 f1, f2, f3 은 각각 Animal과 Cat, Dog타입의 클래스를 매개변수로,

 f4, f5, f6은 모두 Animal 타입의 클래스를 매개변수로 받습니다. 

그 후 print1,2,3 함수들을 출력합니다.


이때 세가지 상황의 함수 형태를 살펴봅니다.

print1 : 부모에도 함수가 정의되어 있고, 자식에게도 함수가 정의 되어 있는 경우

print2 : virtual함수로 부모에도 함수가 정의 되어 있고, 자식에게도 함수가 정의 되어 있는 경우

print3 : 부모에게만 함수가 정의되어 있고, 자식에게는 정의 되어 있지 않은 경우.


* 4번째인 virtual함수로 부모에게만 정의 되어 있는 경우는 *

 * 추상 클래스의 개념으로써 새로운 개념의 이해가 필요합니다. 

* 여기선 다루지 않습니다.*


 

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
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#include<iostream>
 
using namespace std;
 
class Animal {
public :
    const char* print1() { return "Animal "; }
    virtual char* const print2() { return "Animal "; }
    const char* print3() { return "Animal "; }
};
 
class Cat : public Animal {
public:
    const char* print1() { return "Cat "; } //Override
    char* const print2() { return "Cat "; }
};
 
class Dog : public Animal {
public:
    const char* print1() { return "Dog "; }//Override
    char* const print2() { return "Dog "; }
};
 
void f1(Animal* a, Cat* c, Dog* d) {
    cout << a->print1() << c->print1() << d->print1() << endl;
}
void f2(Animal* a, Cat* c, Dog* d) {
    cout << a->print2() << c->print2() << d->print2() << endl;
}
 
void f3(Animal* a, Animal* c, Animal* d) {
    cout << a->print1() << c->print1() << d->print1() << endl;
}
void f4(Animal* a, Animal* c, Animal* d) {
    cout << a->print2() << c->print2() << d->print2() << endl;
}
void f5(Animal *a, Cat*c, Dog *d) {
    cout << a->print3() << c->print3() << d->print3() << endl;
}
void f6(Animal *a, Animal *c, Animal *d) {
    cout << a->print3() << c->print3() << d->print3() << endl;
}
int main() {
    Animal *= new Animal();;
    Cat *= new Cat();
    Dog *= new Dog();;
 
 
    f1(a, c, d);
    f2(a, c, d);
    f3(a, c, d);
    f4(a, c, d);
    f5(a, c, d);
    f6(a, c, d);
 
}
cs



 



결과 설명 :


1번째 줄 

- 부모와 자식에게 똑같은 이름의 함수로 정의되어 있는 경우, 

자식클래스의 경우 함수 호출 할 때 타입이 자식인 경우에는 자식 함수를 Override하여 사용합니다.

2번째 줄

 - 부모와 자식에게 똑같은 이름의 (부모에겐 virtual) 함수로 정의 되어 있는 경우,

자식클래스의 경우 함수 호출 할 때 타입이 자식인 경우에는 자식 함수를 Override하여 사용합니다.


이로 인해 알 수 있는 사실.

virtual이든 일반 선언이든 부모와 자식 간에 같은 함수의 이름이 있을 경우, 

이 함수를 호출하는 타입이 자식 일 경우에는 자식클래스에 정의된 함수를 호출 합니다.


3번째 줄

 - 부모와 자식에게 똑같은 이름의 함수로 정의 되어 있는 경우,

자식 클래스의 경우 함수 호출 할 때 타입이 부모인 경우에는 부모의 함수를 호출 하게 됩니다.


4번째 줄

  - 부모와 자식에게 똑같은 이름의 (부모에겐 virtual) 함수로 정의 되어 있는 경우,

자식 클래스의 경우 함수 호출 할 때 타입이 부모인 경우에도 자식 함수를 Override하여 사용 하게 됩니다.

 

이로 인해 알 수 있는 사실

자식을 부모 타입으로 변환하여 함수를 호출 하면 부모 클래스의 함수가 호출됩니다. 하지만 이 함수가 virtual로 선언되어 있을 경우에는 자식클래스 함수를 호출 하게 됩니다.


5번째 줄과 6번째 줄

어떤 타입으로 함수를 호출하더라도 부모 클래스의 함수를 사용 하게 됩니다.

부모클래스의 함수를 재사용 하게 됩니다.


'Programming > C,C++' 카테고리의 다른 글

new delete + Heap overruns checker  (0) 2017.04.05
c++ new delete overriding / leak checker  (0) 2017.04.03
Overloading vs Overriding [펌]  (0) 2017.03.25
STL vector, list, map [펌]  (0) 2017.03.24
echo server/client  (0) 2017.03.24
Posted by 루나s
,