C++ IS-A 관계의 상속

1 분 소요

문제

‘책’ 을 의미하는 Book 클래스와 ‘전자 책’ 을 의미하는 EBook 클래스를 정의하고자 한다.

그런데 ‘전자 책’도 ‘책’의 일종이므로, 다음의 형태로 클래스의 상속 관계를 구성하고자 한다.

(클래스에 선언되어야 할 멤버변수만 제시하였다.)

class Book
{
private:
    char* title;
    char * isbn;
    int price;
    ...
};

class EBook : public Book
{
private:    
    char* DRMKey;
    ...
};

위의 EBook 클래스에 선언된 멤버 DRMKey는 전자 책에 삽입이 되는 보안관련 키(key)의 정보를 의미한다. 그럼 다음 main 함수와 함께 실행이 가능하도록 위의 클래스를 완성해보자.

main 함수

int main(void)
{
    Book book("좋은 C++", "555-12345-890-0", 20000);
    book.ShowBookInfo();
    cout<<endl;

    EBook ebook("좋은 C++ ebook", "555-12345-890-1", 10000, "fdx9w0i8kiw");
    ebook.ShowEBookInfo();

    return 0;
}

실행의 예

제목: 좋은 C++
ISBN: 555-12345-890-0
가격: 20000


제목: 좋은 C++ ebook
ISBN: 555-12345-890-1
가격: 10000
인증키: fdx9w0i9kiw

해결

코드

#include <iostream>
#include <cstring>
#include <cstdlib>
 
using namespace std;
 
class Book
{
private:
    char* title;
    char* isbn;
    int price;
 
public:
    Book(char* my_title, char* my_isbn, int my_price) : price(my_price)
    {
        title = new char[strlen(my_title) + 1];
        strcpy(title, my_title);
 
        isbn = new char[strlen(my_isbn) + 1];
        strcpy(isbn, my_isbn);
    }
 
    void ShowBookInfo()
    {
        cout << "제목: " << title << endl;
        cout << "ISBN: " << isbn << endl;
        cout << "가격: " << price << endl;
    }
 
    ~Book()
    {
        delete[]title;
        delete[]isbn;
    }
};
 
class EBook : public Book
{
private:
    char* DRMKey;
    
public:
    EBook(char* my_title, char* my_isbn, int my_price, char* my_drm) : Book(my_title, my_isbn, my_price)
    {
        DRMKey = new char[strlen(my_drm) + 1];
        strcpy(DRMKey, my_drm);
    }
 
    void ShowEBookInfo()
    {
        ShowBookInfo();
        cout << "인증키: " << DRMKey << endl;
        cout << endl;
    }
 
    ~EBook()
    {
        delete[]DRMKey;
    }
};
 
int main(void)
{
 
    Book book("좋은 C++", "555-12345-890-0", 20000);
    book.ShowBookInfo();
    cout << endl;
    cout << endl;
 
    EBook ebook("좋은 C++ ebook", "555-12345-890-1", 10000, "fdx9w0i8kiw");
    ebook.ShowEBookInfo();
 
    return 0;
}

댓글남기기