27. [C++] 상속을 위한 조건

2024. 4. 15. 16:56[C++]/C++ 언어 기초


07-2 [IS-A] 관계의 상속 실습 문제

 

문제 1. 정사각형을 의미하는 Square 클래스와 직사각형을 의미하는 Rectangle 클래스를 정의하고자 한다.

그런데 정사각형은 직사각형의 일종이므로, 다음의 형태로 클래스의 상속관계를 구성하고자 한다

 

class Rectangle
{


};


class Square :public Rectangle
{


};

이에 다음 main 함수와 함께 실행이 가능하도록 위의 클래스를 완성해보자

int main(void)

{

        Rectangle rec(4, 3);

        rec.ShowAreaInfo();

 

        Square sqr(7);

        sqr.ShowAreaInfo();

        return 0;

}

 

 

내 풀이

#include "stdafx.h"
#include <iostream>
#include <cstring>

using namespace std;

class Rectangle
{
private:
	int width;
	int height;
public:
	Rectangle (int wid, int hei):width(wid), height(hei){}
	void ShowAreaInfo(){
		cout<<"면적: "<<width*height<<endl;
	}
};

class Square :public Rectangle
{
public:
	Square(int size):Rectangle(size, size){}
};

int main(void)

{
	Rectangle rec(4, 3);
	rec.ShowAreaInfo();
	Square sqr(7);
	sqr.ShowAreaInfo();

	return 0;

}

 

 

 

문제 2. 책을 의미하는 Book 클래스와 '전자 책'을 의미하는 Ebook 클래스를 정의하고자 한다. 그런데 '전자 책'도 '책'의 일종이므로, 다음의 형태로 클래스의 상속관계를 구성하고자 한다 (클래스에 선언되어야 할 멤버변수만 제시하였다)

class Book
{
private:
        char *title; //책의 제목
        char *isbn; //국제표준도서번호
        int price; //책의 정가
};

class Ebook :public Book
{
private:
        char *DRMKey; //보안관련 키
};

위의 EBook 클래스에 선언된 멤버 DRMKey는 전자 책에 삽입이 되는 보안관련 키(key)의 정보를 의미한다.

그럼 다음 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;
}

 

내 코드

#include "stdafx.h"
#include <iostream>
#include <cstring>

using namespace std;

class Book
{
private:
	char *title; //책의 제목
	char *isbn; //국제표준도서번호
	int price; //책의 정가
public:
	Book(char *tit, char *isb, int pri):price(pri){
		title = new char[strlen(tit)+1];
		isbn = new char[strlen(isb)+1];
		strcpy(title, tit);
		strcpy(isbn, isb);
	}
	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 *tit, char * isb, int pri, char *key):Book(tit, isb, pri){
		DRMKey = new char[strlen(key)+1];
		strcpy_s(DRMKey, strlen(key)+1, key);
	}
	void ShowEBookInfo(){
		ShowBookInfo();
		cout<<"인증키: "<<DRMKey<<endl;
	}
	~Ebook(){
		delete []DRMKey;
	}
};

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;
}
반응형