티스토리 뷰

가상 함수
- 추상 메소드의 한 종류
- 많이 쓰면 쓸수록 메모리 낭비가 생길 수 있다
- 사용자가 동적 바인딩을 항상 쓰지 않기 때문에 가상 함수를 쓴다
- 오버라이딩을 할 때 무조건 가상함수를 쓴다고 생각하면 된다
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 = ▭
a->disp();
a = ○
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 |
댓글