프로그래밍/c++

[c++] virtual(가상함수,순수가상함수)

rrruu 2018. 12. 19. 15:37
반응형

c++에서는 virtual 키워드를 통하여 가상함수순수가상함수를 정의할수 있다.

먼저 가상함수와 일반함수의 차이점을 알아보자.

일반함수는 상속된 자식class에서 오버라이드를 통한 재정의가 불가능하지만

가상함수는 상속된 자식class에서 오버라이드를 통한 재정의가 가능하다.


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
class Animal {//부모class 
public:
    void howl()
    {
        cout << "으르렁" << endl;
    }
 
    virtual void v_howl()
    {
        cout << "으르렁" << endl;
    }
};
 
class Dog : public Animal {//자식 class
public:
    void howl()
    {
        cout << "멍멍" << endl;
    }
 
    virtual void v_howl()
    {
        cout << "멍멍" << endl;
    }
};
 
int main()
{
    Animal animal;
    Animal *dog = new Dog();
    animal.howl(); //"으르렁"이 출력된다.
    animal.v_howl();//"으르렁"이 출력된다.
    dog->howl();//"으르렁"이 출력된다.
    dog->v_howl();//"멍멍"이 출력된다.
}
cs


위 예제를 실행시키면 일반함수 howl은 자식class에서 재정의를하였지만 

"으르렁"이 출력이 되고 virtual키워드로 작성된 v_howl함수는 Dog class에서 오버라이딩된 v_howl함수가 작동이되어서

부모 class의 v_howl함수가 아니라 자식 class에서 재정의된 v_howl함수가 작동하여 "멍멍"이 출력이 된다.


순수가상함수란 무엇일까?

가상함수와 차이점이라면 부모class에서 사용이 불가능 하다는 것이다.

부모 class에서는 선언만 해주고 구현은하지 않는다.

오로지 자식class에서 정의를 해줘야한다.


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
class Animal {//부모class 
public:
    virtual void v_howl() = 0;
};
 
class Dog : public Animal {//자식 class
public:
    virtual void v_howl()
    {
        cout << "멍멍" << endl;
    }
};
 
class Cat : public Animal {//자식 class
public:
    virtual void v_howl()
    {
        cout << "야옹" << endl;
    }
};
 
int main()
{
    Dog dog;
    Cat cat;
 
    dog.v_howl();//"멍멍"이 출력된다.
    cat.v_howl();//"야옹"이 출력된다.
}
cs


순수가상함수임을 나타낼때는 =0을 붙인다.

자식class에서 구현된 부분이 실행이 되며 구현이 안되어 있을 시 오류가 발생한다.




반응형