728x90

1. 기초 클래스에서 가상 메서드를 선언하면, 그 함수는 기초 클래스 및 파생되는 클래스에서 모두 가상이 됨

2. 객체에 대한 참조 or 포인터를 사용하여, 가상 메서드가 호출되면 → 참조나 포인터를 위해 정의된 메서드를 사용하지 않고 객체형을 위해 정의된 메서드를 사용한다. (=동적 결합)

3. 상속을 위해 기초 클래스로 사용할 클래스를 정의할 때, 파생 클래스에서 다시 정의해야 되는 클래스 메서드들은 가상 함수로 선언해야 한다.

 


기초 클래스의 데이터와 상속 클래스의 데이터를 출력하는 함수(메서드)를 만들고자 한다.

기존에는 각각에 서로 다른 메서드 show() / print() 를 정의했었다면,

이번에는 동일한 이름의 show() 메서드로 기초 클래스와 상속 클래스의 데이터를 출력해주고자 한다.

이를 위해서는 기초 클래스의 public 영역에서, virtual 키워드를 통해 show 메서드를 '가상 메서드'로 선언하여야 한다.

 

time.h

#include<iostream>
using namespace std;

#ifndef FIRE_C_TIME_H
#define FIRE_C_TIME_H

class Time{
private:
    int hours;
    int mins;
public:
    Time();
    Time(int, int);

    /* virtual 통해 가상 메소드 선언 */
    virtual void show();
    //가상 메소드: 프로그램에서 서로 독립된 메소드 정의가 있다는 것을 알려줌
    //show가 호출되었을 때, 호출한 객체를 따져서, 대응되는 함수를 선택함
    //현재 show가 가상 메소드로 정의된 상태

    int getHour(){return hours;}
    int getMins(){return mins;}
    ~Time();

    Time operator*(int n);
    friend Time operator*(int, Time&);
};

class NewTime : public Time {
private:
    int day;
public:
    NewTime(); //생성자
    NewTime(int, int, int); //생성
    void show();
};

#endif //FIRE_C_TIME_H

 

time_func.cpp

#include "time.h"

Time::Time(){
    hours = 0;
    mins = 0;}

Time::Time(int h, int m){
    hours = h;
    mins = m;}

// (1) 기초형 클래스에서 정의된 show() 메서드
void Time::show(){
    cout << hours << "시간 " << mins << "분" << endl;}

Time::~Time(){}

NewTime::NewTime() : Time(){
day = 0;
}

NewTime::NewTime(int h, int m, int d) : Time(h, m) {
day = d;
}

// (2) 상속 클래스에서 정의된 show() 메서드
/* show가 어디에서 호출되느냐에 따라 다른 기능 수행 - Time vs NewTime */

void NewTime::show(){
    //show(); 이름이 동일해서 재귀적으로 호출되는 문제 발생
    //기초형 클래스의 public 함수를 새로 생성 - private 멤버변수를 반환해주는.
    cout << day << "일 " << getHour() << "시간 " << getMins() << "분" << endl;
}

 

main.cpp

#include "time.h"
#include "time_func.cpp"

//public 함수를 다형으로 사용하기

int main(){
    Time temp1(1, 2);
    NewTime temp2(3, 30, 2);

    temp1.show();
    temp2.show();

    return 0;}

/*1시간 2분
2일 3시간 30분*/

 

728x90

'개발 > c++' 카테고리의 다른 글

[c++] 서로 다른 & (참조자/주소반환)  (0) 2023.09.24
[c++] 동적 결합  (0) 2023.09.11
[c++] 클래스 상속  (0) 2023.09.10
[c++] friend (feat. 연산자 오버로딩 응용)  (0) 2023.09.10
[c++] 연산자 오버로딩  (0) 2023.09.10

+ Recent posts