반응형
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에서 구현된 부분이 실행이 되며 구현이 안되어 있을 시 오류가 발생한다.
반응형
'프로그래밍 > c++' 카테고리의 다른 글
[c++] string 자주 쓰이는 함수 정리 (0) | 2020.09.11 |
---|---|
[c++] 템플릿(template) 함수 및 클래스 (0) | 2018.12.20 |
[c++] class의 상속 (부모class 및 자식class) (0) | 2018.12.19 |
[c++] class의 생성자 및 소멸자 (0) | 2018.12.19 |
[c++] class 정의 및 접근제한자 (0) | 2018.12.19 |