0) 제목
Hackerrank 의 C++>Introduction 부분의 Virtual Functions 문제입니다.
C++ 이용하여 풀었습니다.
기초 클래스 = 상위 클래스 = 슈퍼 클래스 = 부모 클래스
유도 클래스 = 하위 클래스 = 서브 클래스 = 자식 클래스.
1) 문제설명
기초클래스 즉 부모클래스인 Person 클래스를 만들고,
Person 클래스를 상속하는 유도 클래스 즉, 자식 클래스를 상속을 통해서
Professor 클래스와 Student를 만들어서 주어진 input을 받아서
output 형태 대로 출력하는 문제입니다.
main 함수 내에 input과 output의 형태는 주어졌습니다.
hackerrank에서 제공되어있는 form 이 있으므로, 여기에 올리지는 않겠습니다.
제가 작성할 수 있는 코드 부분만 올리겠습니다.
2) 풀이과정
main을 살펴보니 main에서 Person 클래스의 객체 포인터 를 통해서
유도클래스들의 객체를 가리키고 출력하는 방법으로 작성되어있었습니다.
(IS-A) 관계라고 생각하였고, 이것은 C++의 특성중 다형성(Polymorphism)을 생각하였습니다.
virtual function을 이용하여
포인터의 자료형으로 주어진 기초클래스(Person)의 함수를 부르지 않고
포인터 변수가 실제로 가리키는 객체(유도클래스)를 참조하여 함수를 부를 수 있도록
기초글래스(Person)에 virtual function(가상함수)를 이용했습니다.
또한, 객체의 갯수를 각각 세서 출력하는 것을 요구했기 때문에
클래스 내부에 static 멤버 변수를 만들어서, 출력할때마다 +1 하여 갯수를 셀 수 있도록 하였습니다.
3) 함수설명
(저는 setdata와 getdata를 사용해서 입력과 출력을 했었는데, Hackerrank에서는 getdata로 입력을, putdata로 출력으로 이용하는 방식으로 문제를 줬습니다.)
getdata : 데이터를 입력받는다.
putdata : 데이터를 주어진 형식에 맞게 출력한다.
4) 코드
//헤더와 using namespace std; 는 hackerrank에 주어져있습니다.
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 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 | //////////////////기초클래스 : Person////////////////// class Person{ private: char name[100]; int age; public: virtual void getdata(){} //가상함수 (virtual function) virtual void putdata(){} //가상함수 (virtual function) void setName(){ cin >> name; } void setAge(){ cin >> age; } const char * getName() const{ return name; } int getAge() const{ return age; } }; //////////////////유도클래스 : Professor////////////////// class Professor : public Person{ private: int publications; static int cur_id; //staic 멤버 변수 public: Professor():publications(0){ } void getdata(){ setName(); setAge(); cin >> publications; } int getPub() const{ return publications; } int getId() { return ++cur_id; } void putdata(){ cout << Person::getName() << " " ; cout << Person::getAge() << " " ; cout << getPub() << " "; cout << getId() << endl; } }; int Professor::cur_id =0; //staic 멤버 변수 초기화 //////////////////유도클래스 : Student////////////////// class Student : public Person{ private: int subject[6]; int sum; static int cur_id; //staic 멤버 변수 public: Student():sum(0) { } void getdata(){ int num; setName(); setAge(); for(int i=0; i<6; i++){ cin >> num; subject[i] = num; } for(int i=0 ; i<6 ; i++){ sum += subject[i]; } } int getSum() const{ return sum; } int getId() { return ++cur_id; } void putdata(){ cout << Person::getName() << " " ; cout << Person::getAge() << " " ; cout << getSum() << " " ; cout << getId() << endl; } }; int Student::cur_id =0; //staic 멤버 변수 초기화 | cs |
5) 인증
경로 : Dashboard>C++>Introduction>Virtual Functions
출처 : [HackerRank] https://www.hackerrank.com/challenges/virtual-functions
C하다가 C++ 하니까 헷갈리네요..
C++ 은 C 보다 더 많이 부족합니다.
더 나은 코드로 보완 할 곳이 있으면 말씀해주세요.
부족한 코드 많은 지적 부탁드립니다.
'<알고리즘 문제풀이&연습> > [C++] 백준, 프로그래머스 등등' 카테고리의 다른 글
[C++ 예외처리] Exceptional Server (bad_alloc, exception) (0) | 2017.07.17 |
---|---|
[C 자료구조] Stack - Simple Text Editor (0) | 2017.07.14 |
[C 자료구조] Array - Left Rotation (0) | 2017.07.13 |
[C 자료구조] Tree - Is This a Binary Search Tree? (0) | 2017.07.11 |
[C++ 동적할당] Variable Sized Arrays (배열) (0) | 2017.07.08 |
[C 자료구조] Stack - Balanced Brackets (0) | 2017.07.07 |
[C 자료구조] Linked Lists -Reverse a doubly linked list (1) | 2017.07.06 |
[C 자료구조] Heap - QHEAP1 (0) | 2017.07.05 |