-
[c++] 순수가상함수와 추상클래스C++ 2023. 1. 6. 14:17
앞서 본 FootballPlayer는 사실 좀 더 개선할만한 여지가 남아있음
class FootballPlayer { private: int num; int salary; char name[20]; public: FootballPlayer(const char* myname, int n, int s) : num(n), salary(s) { strcpy(name, myname); } void GetFPInfo() { cout << "#" << num << " " << name <<" $"<<salary <<endl; } };이 FootballPlayer는 Striker Midfielder를 위해 존재하는 그저 한 개의 부모클래스에 불과하지
실제로 생성되는 클래스가 아님
그러므로 우리는 FootballPlayer 클래스를 생성하는 것이
비단 문법적인 오류나 에러는 아니더라도,
우리의 의도와 맞지 않는 행동이기에
(객체를 생성하는게 쓸데없는 행동임. 애초에 Stirker와 Midfielder 객체만 사용할거니까 이걸 생성할 필요가 없음)
FootballPlayer 객체 생성을 막을 수 있으면 좋다
그래서 나온게 "추상클래스와 순수가상함수"임
[추상클래스(abstract class)]
객체생성이 목적이 아닌 클래스
자식클래스의 베이스 역할만 하는 부모클래스로
객체로써 생성될 필요가 없는 클래스를 말한다!
하나 이상의 순수 가상함수를 가지고 있으면 자동으로 추상클래스가 된다
그냥 가지고만 있으면 되는거임!
따로 뭐 해줄거 없다
[순수가상함수(pure virtual function)]
순수가상함수는 함수의 몸체가 정의되지 않은 함수를 의미한다.
그리고 몸체가 정의되지 않음을 표현하기 위해 "=0" 으로 표시한다.
이는 명시적으로 몸체를 정의하지 않았음을 컴파일러에게 알리는 것이다.
따라서 FootballPlayer 클래스의 GetFPInfo() 함수를 순수가상함수로 바꿔줌으로써 추상클래스로 선언할 수 있다.
그럼 이제 FootballPlayer 객체는 만들지 못한다. 에러뜸 ㅇㅇ
// 추상클래스 ( 객체 생성 X ) class FootballPlayer { private: int num; int salary; char name[20]; public: FootballPlayer(const char* myname, int n, int s) : num(n), salary(s) { strcpy(name, myname); } // 순수 가상함수( 몸체 = 0 ) // 자식 클래스에서 구현해주어야함 virtual void GetFPInfo() const = 0; };아래는 책에 나온 예시이다.
// 추상클래스 ( 객체 생성 X ) class Employee { private: char name[100]; public: Employee(char* name) { strcpy(this->name, name); } void ShowYourName() const { cout << name << endl; } // 순수 가상함수로 선언 virtual int GetPay() const = 0; // 순수 가상함수로 선언 virtual void ShowSalaryInfo() const = 0; };이렇게 한 개 이상의 순수 가상함수가 선언되면 이 클래스는 자동으로 추상클래스가 된다
컴파일러가 그렇게 인식한다.
따라서 아래와 같이 직접 추상클래스의 객체를 생성하려들면
Employee* emp = new Employee("Thomas Frank");에러가 뜬다!!
자바랑 똑같다
'C++' 카테고리의 다른 글
[c++] 연산자 오버로딩 (operator overloading) (1) (0) 2023.01.08 [c++] 순수가상함수와 추상클래스 관련 특징 (0) 2023.01.06 [c++] 가상함수(virtual functions) (0) 2023.01.05 [C++] 다형성 특징 (0) 2023.01.04 [C++] 다형성(polymorphism) (0) 2023.01.04