가상함수란?

: virtual 키워드를 함수 앞에 붙임으로써, 다형성을 제공한다.
가상함수들의 함수포인터가 v-table에 저장되고,
자식 클래스가 부모의 virtual함수를 오버라이딩하면,
자식 클래스의 v-table에 오버라이딩 함수가 매핑된다.
상향형변환 상태에서 가상함수 포인터와 v-table을 이용해 오버라이딩 함수를 사용할 수 있따.

사용하는 이유와 용도.

: 파생클래스가 기능을 물려받을 수 있고, 재정의 함으로써 새로운 기능을
구현할 수 있다.

특징

  • virtual 키워드 사용
  • 런타임중에 호출할 함수가 정해지기 때문에 동적바인딩이다.
  • 파생클래스에서 메서드를 재정의하면 , 부모에서 virtual 키워드가 붙은 메서드를 무시할 수 있다.

base로 derive 클래스를 할당할 경우


-> derive 클래스의 소멸자가 호출되지 않은 것을 확인할 수 잇따.
=> 소멸자에 virtual이라는 키워드를 추가해야 한다.

상속받은 클래스에서는

: 부모 클래스에서는 자식에 보낼 함수를 virtual 키워드를 붙이고,
자식쪽은 상속받았다라는 의미로 override키워드를 붙여준다.


-> virtual 키워드를 붙여야만 cat클래스의 speak함수를 호출할 수 있다.

파생클래스를 정적으로 사용


-> 파생클래스의 함수가 호출된다.

참조형식과 실형식

  • virtual이 선언되지 않은 상태에서

    : Cat은 실형식이고, polyCat은 참조형식이다.
    실형식과 참조형식이 다를 경우에는 참조형식의 함수가 호출된다.
    이때는 잠재적으로 메모리 누수 문제가 생길수있다.
    왜냐면 실형식의 소멸자를 호출해야 하지만, 참조형식의 소멸자만 호출되기 때문이다.

-> vitual 선언을 통해 이와 같은 문제를 해결할 수 있다.

  • virtual 키워드를 선언함으로써 실형식인 Cat의 speak함수를 호출할 수 있다.

=>일반 메서드는 참조형식을 따르지만, 가상함수는 실형식을 따른다.

소멸자 가상화

: 상위클래스로 하위파생 클래스를 참조할 경우,
상위 클래스 형식을 추상 자료형이라고 한다.

사람 = new 원태

이 때 부모클래스의 소멸자를 virtual 사용하지 않으면 파생클래스의 소멸자가 호출되지 않으므로 반드시 소멸자에 virtual 키워드를 사용하도록 해야 한다.

가상 소멸자를 사용해야하는이유

: 상향형변환으로 객체를 동적할당한 후, delete를 할 경우, 포인터의 자료형인 참조형식의 값만 해제가된다. 실형식의 소멸자도
파생클래스의 소멸자도 호출하기 위해서 기본클래스의 소멸자에 반드시 vitual 키워드를 사용해야 한다.
만약에 파생클래스에 메모리 할당을 햇다면, 소멸자가 호출되지 않으므로 메모리 누수가 발생한다.

상세 설명.

자료형은 부모 형식으로 선언했으므로, 부모의 소멸자만 호출된다. 하지만 소멸자에 virtual 선언으로 객체의 가상함수 테이블에 소멸자를 추가함으로써 포인터 제거시
파생클래스의 소멸자도 호출되는 것이다.

  • virtual 키워드 사용하면 올바르게 실형식 소멸자 호출된다.

동적바인딩 증명하는 과정

: 이것이 c++이다. 페이지 324

이것이 c++이다 예제

: 페이지 309를 보고 어떻게 출력 될것인가에 대해 예상해보자

profile
🔥🔥🔥

0개의 댓글