티스토리 뷰

Programming/C++

[c++]순수가상함수

쩨리쩨리 2018. 3. 13. 22:27
반응형

* 순수가상함수(추상 함수)

순수가상함수는 함수 헤더만 존재하고 함수의 몸체는 없는 함수이다. 순수가상함수를 하나라도 가지고 있는 추상클래스(abstract class)라고 한다. 추상 클래스로는 객체를 생성 할 수 없다.

 

추상 클래스는 추상적인 개념을 나타내거나 클래스와 클래스 사이의 인터페이스를 나타내는 용도로 사용된다. 추상 클래스는 멤버 함수의 원형만을 정의하는 것이고 그 구현은 자식 클래스에서 하게 된다. 추상 클래스를 상속받는 자식 클래스는 반드시 순수가상함수를 구현해야 한다.

 

순수가상함수는 형식 정의문에서 가상 함수 선언문 뒤에 =0 을 명시한다. 또 자식 클래스에서 부모 클래스의 순수가상 함수를 재정의(오버라이딩)하지 않으면 추상 클래스가 되어 객체를 생성할 수 없다. 따라서 객체를 생성 할 수 있는 클래스를 만들기 위해서는 상속 형식의 순수가상함수를 재정의 해야한다.

 

모든 멤버가 순수가상함수이면서 접근 지정이 public으로 상속 지정한 형식을 인터페이스라 할 수 있다. java나 c#에서는 인터페이스를 형식으로 제공하지만 c++에서는 제공하지 않는다.

 

 

 

 

* 순수가상함수 특징

1. virtual void 함수이름()=0; 으로 명시한다.

2. 자식들에게 강제적으로 오버라이딩을 명령한다. (강제성)

3. 자식 클래스가 오버라이딩을 하지 않을 경우 자식 클래스도 추상클래스화 되어서 객체를 생성 할 수 없다.

4. 동적 바인딩 할시 원활한 서비스를 제공한다.

 

 

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#include<iostream>
#include<string>
using namespace std;
 
class Area {//추상클래스//java에선 추상클래스 명시가 필수지만 c++은 명시 안해도 됨
public:
    virtual void disp() {};
};
 
class Rect :public Area {//네모
public:
    void disp() {cout<<"Rect"<<endl;}
};
 
class Cir :public Area {//동그라미
public:
    void disp() {cout << "Cir" << endl;}
};
 
void main() {
 
    Rect rect;//추상클래스를 객체로 만들려면 자식이 추상함수를 완수해야함.
    Cir cir;
    
    //rect.disp();//정적바인딩
    //cir.disp();//정적바인딩
 
    Area *area;//부모 포인터 생성
 
    area = &rect;//자식의 주소를 잡음
    area->disp();
    //부모 함수가 virtual가 있기 때문에 자식이 우선시되어 부모를 거치지 않고 자식에게 먼저 접근
 
    area = &cir;//자식의 주소를 잡음
    area->disp();
    //부모 함수가 virtual가 있기 때문에 자식이 우선시되어 부모를 거치지 않고 자식에게 먼저 접근
 
    //상속된것을 유지하면서 
    //자식들 기능을 더해 반드시 재정의 하게 만듬
 
}
 
cs

 

 

 

 

 

 

 

 

 

 

 

 

반응형
댓글
공지사항