c++ virtual

자료구조 공부하다가 메소드 이름 앞 virtual을 봤는데
뭔지 전혀 기억이 안나서 검색해서 정리해놨던걸 정리함

상속관계에서 중요

오버라이딩했을때 virtual을 안붙인다면??

1
2
3
4
5
6
7
8
9
class Bag{
    public:
        void print(){ std::cout<<"Bag"<<std::endl; }
};

class Stack : public Bag{
    public:
        void print(){ std::cout<<"Stack"<<std::endl; }
};

위와 같은 구조의 클래스가 있을 때

1
2
3
4
5
6
7
int main(){
    Bag* bag;
    Stack stack;
    bag = &stack;

    bag.print();
}

main 함수를 실행시키면
Bag으로 선언한 객체에서 print()메소드를 사용했기 때문에
부모클래스인 Bag::print()가 실행된다

1
Bag

근데 void Bag::print()앞에 virtual을 붙인다면??

main 함수 실행시
자식클래스인 Stack::print()가 실행됨!

1
Stack

결론

  • 이유 : virtual로 메소드를 선언하면 컴파일 타임에 결정되지 않고
    런타임에 결정된다고 함.

  • 오버라이딩했을때 자바에서처럼 다형성을 만들고 싶으면
    앞에 virtual을 붙여줘야한다.

  • 참고자료 : 오래전에 검색했던거라 기억이 안남

태그:

카테고리:

업데이트:

댓글남기기