wn42
코딩이랑 이것저것
wn42
전체 방문자
오늘
어제
  • 분류 전체보기 (113)
    • 프로그래머스 (23)
      • LV1 (11)
      • LV2 (1)
      • LV3 (3)
      • 연습 (8)
    • 딥러닝 공부 (0)
      • 머신러닝&딥러닝 이론 (0)
    • 임베디드 (17)
      • Adventure Design (1)
      • 센서기반모바일로봇 (5)
      • ROS (9)
      • Google Coral (2)
    • C++ (38)
      • C++ 기초 (34)
      • 자료구조 및 알고리즘 (4)
    • Python (14)
      • 기본 파이썬 문법 (6)
      • Python 기초 (8)
    • 빅데이터 (9)
      • 빅데이터 첫걸음 시작하기(국비지원) (5)
      • 빅데이터 공부 (4)
    • 알고리즘 공부 (2)
      • 기본 알고리즘 (2)
    • 전자공학 (10)
      • 반도체 공정 (3)
      • 무선데이터통신 (7)
      • 반도체공학 (0)
    • C# (0)
      • C# 기본 (0)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 조건문
  • 내일배움카드
  • 스택/큐
  • 정렬
  • 클래스
  • 빅데이터
  • Python
  • 스택
  • 파이썬
  • 변수
  • 큐
  • google coral
  • 인스턴스
  • 바이트디그리
  • ROS
  • 데이터분석
  • 소멸자
  • 노드
  • 프로그래머스
  • Queue
  • 상속
  • 빅데이터 첫걸음 시작하기
  • stl
  • numpy
  • 데이터분석 인강
  • 패스트캠퍼스
  • c++
  • 반복문
  • 딥러닝
  • K디지털크레딧

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
wn42
C++/C++ 기초

[C++] 순수 가상 함수 / 추상 클래스

C++/C++ 기초

[C++] 순수 가상 함수 / 추상 클래스

2023. 1. 17. 16:30

 순수 가상 함수(Pure Virtual Function) 

가상 함수 중 파생 클래스에서 반드시 재정의해야 하는 멤버 함수

  • 함수의 동작을 정의하는 본체를 가지고 있지 않다.
  • 파생 클래스에서 재정의하지 않으면 사용할 수 없다.

 

순수 가상 함수 선언

  • 순수 가상 함수를 선언하는 문법은 다음과 같다.
virtual 멤버함수의원형=0;	// '=0'은 함수만 있고 본체는 없다는 의미

 

순수 가상 함수 예제

#include <iostream>
using namespace std;
class Animal {
public:
Animal() {}
virtual ~Animal() {} // 가상 소멸자 선언
virtual void Cry() = 0; // 순수 가상 함수 선언
};
class Dog : public Animal {
public:
Dog() : Animal() {}
virtual void Cry() { cout << "Woof Woof!!" << endl; }
};
class Cat : public Animal {
public:
Cat() : Animal() {}
void Cry() override { cout << "Meow Meow~~" << endl; }
};
int main(void) {
Dog dog;
Cat cat;
dog.Cry();
cat.Cry();
return 0;
}
Woof Woof!!
Meow Meow~~
  • 유의할 점으로 순수 가상 함수를 멤버로 갖는 Animal은 함수를 호출하는 것은 물론, 객체를 생성하는 것조차 불가능하다. (컴파일 오류 발생)
  • 이는 C++에서 순수 가상 함수를 1개 이상 포함하는 모든 클래스의 객체를 생성할 수 없도록 만들었기 때문이다. 순수 가상 함수를 1개 이상 포함하여 반드시 상속이 필요한 클래스를 추상 클래스(abstract class)라고 한다.

 

 

 추상 클래스(Abstract Class) 

하나 이상의 순수 가상 함수를 포함하는 클래스

  • 추상 클래스를 상속받는 모든 파생 클래스들은 순수 가상 함수를 반드시 재정의해야 한다.
  • 추상 클래스 자체로 인스턴스화할 수 없다. 반드시 파생클래스로의 상속이 필요한 일종의 '설계도'이다.
  • 추상 클래스는 다음의 용도로는 사용할 수 없다.
    • 변수 또는 멤버 변수
    • 함수의 전달되는 인수 타입
    • 함수의 반환 타입
    • 명시적 타입 변환의 타입

class Animal {
public:
Animal() {}
virtual ~Animal() {} // 가상 소멸자 선언
virtual void Cry() = 0; // 순수 가상 함수 선언
};
  • 위 예제에서는 Animal이 추상 클래스이다.

 

추상 클래스를 가리키는 포인터

  • 추상 클래스 자체의 객체를 생성할 수는 없지만, 추상 클래스를 가리키는 포인터는 만들 수 있다.
  • 앞선 예제의 main에서 아래와 같이 Animal 포인터를 만들어 오버라이딩을 수행할 수 있다.
int main(void) {
Animal* dog = new Dog();
Animal* cat = new Cat();
dog->Cry();
cat->Cry();
return 0;
}
// 결과
Woof Woof!!
Meow Meow~~
  •  순수 가상 함수(Pure Virtual Function) 
  • 순수 가상 함수 선언
  •  추상 클래스(Abstract Class) 
  • 추상 클래스를 가리키는 포인터
'C++/C++ 기초' 카테고리의 다른 글
  • [C++] 템플릿 응용
  • [C++] 템플릿 (Template)
  • [C++] virtual 소멸자
  • [C++] 클래스 상속 (Inheritance)
wn42
wn42
코딩이랑 이것저것 하는 블로그

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.