본문 바로가기
프로그래밍/C++

C++ 가상 함수

by Roland 2021. 11. 22.
C++ Virtual Function

 

가상 함수는 파생 클래스에서 다시 정의할 멤버 함수이다,
포인터 또는 기본 클래스에 대한 참조를 사용하여 파생 클래스의 개체를 참조하면
해당 개체에 대해 가상 함수를 호출하고, 파생 클래스의 함수를 실행 할 수 있습니다.
 
가상 함수는 주로 실행시간에 함수의 다형성을 구현하는데 사용된다.
 
 
가상 함수는 기본 클래스내에서 virtual 키워드로 함수를 선언한다.
 1.가상 함수 선언시에는 몇가지 규칙이 존재하는데,
 2.클래스의 public 영역에 선언해야 한다.
 3.가상 함수는 Static 일 수 없으며 다른 Friend 함수가 될 수도 없다.

 4.가상함수는  실행시간 다형성을 얻기 위해 기본 클래스의 포인터 또는 참조를 통해 접근 해야 한다.가상 함수의 프로     토타입(반환형과 매개변수)은 기본 클래스와 파생 클래스에서 동일 하여야 한다.

 5.클래스는 가상 소멸자를 가질 수 있지만 가상 생성자를 가질 수 없다.

 
iCamera 클래스를 가르키는 포인터 i를 선언하고,  iCamera를 상속받는 Camera와 HdCamera를 선언했습니다.
 
이 포인터 i는 C객체를 가르킨다. 몸체는 iCamera지만 실제 객체는 Camera라는 뜻이다.
 
즉 여기서 iCamera에 선언된 Print() 함수와 Take() 함수를 호출하게 되면 어떻게 될까?

 

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
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
#include <iostream>
 
using namespace std;
 
class iCamera
{
public:
    void Print()
    {
        cout << "ICamera" << endl;
    }
 
    virtual void take() = 0;
 
 
};
 
class Camera : public iCamera
{
public:
    void Print()
    {
        cout << "Camera" << endl;
    }
 
    void take()
    {
        cout << "I am Camera" << endl;
    }
};
 
class HdCamera : public iCamera
{
public:
    void Print()
    {
        cout << "HdCamera" << endl;
    }
 
    void take()
    {
        cout << "I am HdCamera " << endl;
    }
};
 
class Show
{
public:
    void Showing(iCamera * ic)
    {
        ic->take();
    }
};
 
 
int main()
{
    iCamera* i;
 
    Camera c;
    HdCamera h;
 
    Show s;
 
    
    i = &c;
 
    i->take();
    i->Print();
    
    /*s.Showing(&c);
    s.Showing(&h);*/
 
 
    return 0;
}
cs

 

가상 함수는 실행시간에 그 값이 결정되는데 (후기 바인딩 )
포인터 i에는 Camera 개체가 들어가 있고 포인터가 가르키는 위치에 따라 Camera 클래스의 Take() 함수를 호출하는 것이다.

 

'프로그래밍 > C++' 카테고리의 다른 글

C++ " " 와 < > 차이  (0) 2021.12.06
C++ 함수의 원형<prototype>을 선언하는 이유  (0) 2021.09.13

댓글