티스토리 뷰

LANGUAGE/C++

[C++] VIRTUAL FUNCTION - 가상 함수

진심스테이크 2018. 3. 13. 13:34

 

가상 함수

- 추상 메소드의 한 종류

- 많이 쓰면 쓸수록 메모리 낭비가 생길 수 있다

- 사용자가 동적 바인딩을 항상 쓰지 않기 때문에 가상 함수를 쓴다

- 오버라이딩을 할 때 무조건 가상함수를 쓴다고 생각하면 된다

 

int a  

int b 

*vptr 

 

가상함수를 사용하면 *vptr의 공간이 생긴다

 

 

소멸자에서 무조건 생성해야함

#include "stdafx.h"
#include <iostream>
using namespace std;

class A {
public :
    A() { cout << "A::A()" << endl; }
    virtual ~A() { cout << "A::~A()" << endl; }
};

class B : public A{
public:
    B() { cout << "B::B()" << endl; }
    virtual ~B() { cout << "B::~B()" << endl; }
};

void main() {
    //stack : FILO
    //B bb; // A B ~B ~A

    A *p = new B; //~B 안불려짐 -> 소멸자는 가상함수로 만들어라  
    delete p;
}

 

virtual을 붙힌 클래스의 자식을 우선시로 한다 = 자식이 없으면 부모를 우선시한다

- B는 자식이 없기 때문에 붙혀도 안붙혀도 상관이 없음 : ~A를 갔다가 ~B로 감 -> 거쳐 가겠다 라는 개념

 


 

순수 가상 함수 : 순수하게 선언만 되어있는 가상함수

- 자식만 사용할 수 있다

- 자식들에게 강제적으로 오버라이딩을 명령한다

- 자식클래스가 오버라이딩을 하지 않을 경우

- 자식클래스도 추상클래스화 된다

- 정적 바인딩, 동적 바인딩을 원활하게 사용하게 제공

- 자식들이 가져야 할 특징이 똑같은데, 출력할 대상이 다를 때 사용

 

기본 형태

virtual void 함수이름( ) = 0; 

ex) virtual void disp( ) = 0;

#include "stdafx.h"
#include <iostream>
using namespace std;

class Area { //추상클래스
public :
    virtual void disp() = 0; //꼭 오버라이딩
};

class Rect: public Area {
public : 
    void disp() {
        cout << "Rectangle" << endl;
    }
};

class Cir : public Area {
public :
    void disp() { //가상함수 - 오버라이딩
        cout << "Circle" << endl;
    }
};

void main() {
    Rect rect;
    Cir cir;

    rect.disp(); //정적 바인딩
    cir.disp(); //정적 바인딩

    Area *a;
    a = &rect;
    a->disp();

    a = &cir;
    a->disp();
}

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

[C++] FRIEND  (0) 2018.03.14
[C++] STACK / QUEUE  (0) 2018.03.14
[C++] DYNAMIC BINDING - 동적 바인딩  (0) 2018.03.13
[C++] ABSTRACT CLASS - 추상 클래스  (0) 2018.03.13
[C++] MULTIPLE INHERITANCE - 다중 상속  (0) 2018.03.13
댓글