ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Overriding과 Virtual
    C++ 2014. 2. 14. 01:56

    Overriding을 사용하는 목적은 자식 클래스에서 부모 클래스의 멤버나 함수를 재정의해서 쓰는 것이다.

    기본적인 문법적 사용방법은Overriding되는 함수에 부모, 자식 모두에게 항상 Virtual을 사용하라는 것이다.

    이렇게 사용하면 생성된 객체의 멤버함수가 언제나 호출이 된다.

    혼란이 발생하는 경우는 다형성이 사용되는 경우인데

        First* pf2 = new Second();

        pf2->print(); // Virtual 특성에 의해 자식의 함수가 호출

        delete pf2;

    호출이 되는 순서를 보면 print() 가 호출이 되면 먼저 pf2의 포인터가 가르키는 부모의 print()를 찾고 virtual이 선언되었으므로 child로 내려가서 print()를 수행한다.

    만일 Virtual 선언되지 않으면 당연한 결과이지만Overriding은 발생하지 않고 부모의 함수가 호출이 된다.

     

    Pure virtual function과의 차이

    부모의 클래스에서 Pure로 선언이 되었으므로 부모 클래스로 객체가 생성이 불가능하다. 그러나 위의 코드 같이

    부모의 클래스의 타입으로 자식 객체 생성은 가능하다.


    부모 Class의 멤버를 지정하여 수행

    Virtual로 Overriding을 하면 Polimophism에서는 언제나 Override된 Function만 호출이 된다.
    그러나 virtual 이 선언이 되어 있어도 Override를 하지 않고 부모의 member function을 호출하고자 할 때는 scope 연산자를 사용한다.

    이런 경우는 

    상속을 받은 클래스가 부모의 클래스의 기능을 호출하여 사용하고자 할 때, 즉 Overide된 Member Function이 부모의 Function을 참조하여 자기가 추가를 하고자 할때 사용하면 편리하다. 

    주의 할 점은 위의 코드에서 자식 Class에서

    Second:: print()
    {
         print();  // Parent class의 print를 호출
         cout << " "second print()  mb " << getB() << endl;

    main()
    {

       First* pf2 = new Second();

        pf2->print(); // Virtual 특성에 의해 자식의 함수가 호출

        delete pf2;

    }

    위의 함수는  부모의 함수를 호출하고자 하나 부모의 함수가 virtual 로 선언이 되어서 결국은 자신을 호출하게 된다.

    이를 해결하기 위해 print() 대신 First::print()를 사용한다.


    'C++' 카테고리의 다른 글

    Up-casting and Object Slicing  (0) 2014.02.14
    Polymophism의 사용  (0) 2014.02.14
    Inheritance에서 virtual destructor  (0) 2014.02.14
    Copy Constructor vs Assignment operator  (0) 2014.02.12
    Constructor 와 메모리  (0) 2014.02.12
Designed by Tistory.