<알고리즘 문제풀이&연습>/[C++] 백준, 프로그래머스 등등

[C++ 상속/virtual] Virtual Functions (가상함수)

BlockDMask 2017. 7. 10. 12:41
반응형

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 보다 더 많이 부족합니다.

더 나은 코드로 보완 할 곳이 있으면 말씀해주세요.

부족한 코드 많은 지적 부탁드립니다.

반응형