728x90
728x90
윤성우 열혈 C++ 07.상속의 이해 연습문제

 

문제 07-1. [상속과 생성자의 호출]

1. 다음 클래스에 적절한 생성자를 삽입하고, 확인을 위한 main 함수를 정의해보자.

#include <iostream>
using namespace std;

class Car 
{ //기본 연료 자동차
private:
    int gasolineGauge;
public: 
    int GetGasGauge()
    {
        return gasolineGauge;
    }
};
 
class HybridCar: public Car
{ //하이브리드 자동차
private:
    int electricGauge;
public:  
    int GetElecGuage()
    {
        return electricGauge;
    }
};

class HybridWaterCar: public HybridCar
{ //하이브리드 수중차
private:
    int waterGuage;
public:  
    void ShowCurrentGuage()
    {
        cout<<"잔여 가솔린: "<<GetGasGauge()<<endl;
        cout<<"잔여 전기량: "<<GetElecGuage()<<endl;
        cout<<"잔여 워터량: "<<waterGuage<<endl;
    }
};

 

푼 것

#include <iostream>
using namespace std;

class Car 
{ //기본 연료 자동차
private:
    int gasolineGauge;
public:
    Car(int mygasolineGauge) : gasolineGauge(mygasolineGauge)
    {    }
    int GetGasGauge()
    {
        return gasolineGauge;
    }
};
 
class HybridCar: public Car
{ //하이브리드 자동차
private:
    int electricGauge;
public: 
    HybridCar(int mygasolineGauge, int myelectricGauge) 
        : Car(mygasolineGauge), electricGauge(myelectricGauge)
    {    }
    int GetElecGuage()
    {
        return electricGauge;
    }
};

class HybridWaterCar: public HybridCar
{ //하이브리드 수중차
private:
    int waterGuage;
public: 
    HybridWaterCar(int mygasolineGauge, int myelectricGauge, int mywaterGuage) 
        : HybridCar(mygasolineGauge, myelectricGauge), waterGuage(mywaterGuage)
    {    }
    void ShowCurrentGuage()
    {
        cout<<"잔여 가솔린: "<<GetGasGauge()<<endl;
        cout<<"잔여 전기량: "<<GetElecGuage()<<endl;
        cout<<"잔여 워터량: "<<waterGuage<<endl;
    }
};

int main()
{
    HybridWaterCar car1(1,2,3);
    car1.ShowCurrentGuage();
    
    return 0;
}

 

 

2. 다음 두 클래스에 적절한 생성자와 소멸자를 정의해보자. 그리고 확인을 위한 main 함수를 정의해보자.

#include <iostream>
using namespace std; 

class MyFriendInfo
{
private:
    char* name;
    int age;
public:
    void ShowMyFreindInfo()
    {
        cout<<"이름: "<<name<<endl;
        cout<<"나이: "<<age<<endl;
    }
};

class MyFriendDetailInfo: public MyFriendInfo
{
private:
    char* addr;
    char* phone;
public:
    void ShowMyFreindDetailInfo()
    {
        ShowMyFreindInfo();
        cout<<"주소: "<<addr<<endl;
        cout<<"전화: "<<phone<<endl<<endl;
    }
};

 

푼 것

* delete []배열!

#include <iostream>
#include <cstring>
using namespace std; 

class MyFriendInfo
{
private:
    char* name;
    int age;
public:
    MyFriendInfo(char *myname, int myage) 
        : age(myage)
    {
        name=new char[strlen(myname)+1];
        strcpy(name, myname);
    }
    void ShowMyFreindInfo()
    {
        cout<<"이름: "<<name<<endl;
        cout<<"나이: "<<age<<endl;
    }
    ~MyFriendInfo()
    {
        cout<<"MyFriendInfo 소멸자 호출"<<endl;
		delete []name;
    }
};

class MyFriendDetailInfo: public MyFriendInfo
{
private:
    char* addr;
    char* phone;
public:
    MyFriendDetailInfo(char *myname, int myage, char *myaddr, char *myphone) 
        : MyFriendInfo(myname, myage)
    {
        addr=new char[strlen(myaddr)+1];
        phone=new char[strlen(myphone)+1];
        strcpy(addr, myaddr);
        strcpy(phone, myphone);
    }
    void ShowMyFreindDetailInfo()
    {
        ShowMyFreindInfo();
        cout<<"주소: "<<addr<<endl;
        cout<<"전화: "<<phone<<endl<<endl;
    }
     ~MyFriendDetailInfo()
    {
        cout<<"MyFriendDetailInfo 소멸자 호출"<<endl;
		delete []addr;
		delete []phone;
    }
};

int main()
{
    MyFriendDetailInfo friend1("코딩맛집", 20, "ㅇㅇ시", "010");
    friend1.ShowMyFreindDetailInfo();

    return 0;
}

 

 

 

 

 

문제 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;
}

실행 예

면적: 12
면적: 49

 

 

푼 것

#include <iostream>
#include <cstring>
using namespace std;

// 사각형
class Rectangle
{
private:
    int x;
    int y;
    int rectangleArea;
public:
    Rectangle(int width, int length)
        : x(width), y(length)
    {
        rectangleArea = x*y;
    }
	void ShowAreaInfo()
	{
	    cout<<"면적 : "<<rectangleArea<<endl;
	}
};

// 정사각형
class Square: public Rectangle
{ 
private:
    int l;
public:
    Square(int line)
        : Rectangle(line, line)
    {    }
};

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; // 보안관련 키
	....
};

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, "fdx9w0i8kw");
	ebook.ShowEBookInfo();
	return 0;
}

실행 예

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

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

 

 

푼 것

#include <iostream>
#include <cstring>
using namespace std;

class Book
{
private:
	char* title;  // 책의 제목
	char* isbn;  // 국제표준도서번호
	int price;   // 책의 정가 
	
public:
    Book(const char* btitle, const char* bisbn, int bprice)
        : price(bprice)
    {
        title=new char[strlen(btitle)+1];
        isbn=new char[strlen(bisbn)+1]; 
        strcpy(title, btitle);     
        strcpy(isbn, bisbn);     
    }
    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(const char* btitle, const char* bisbn, int bprice, const char* bDRMKey)
        : Book(btitle, bisbn, bprice)
    {
        DRMKey=new char[strlen(bDRMKey)+1]; 
        strcpy(DRMKey, bDRMKey);     
    }
    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, "fdx9w0i8kw");
	ebook.ShowEBookInfo();
	return 0;
}

 

 

답안지 비교

이렇게 쓰면 편리하겠다..

Book(const char* _title, const char* _isbn, int _value)
        : price(_value)
    {
        this->title=new char[strlen(_title)+1];
        this->isbn=new char[strlen(_isbn)+1];
        strcpy(this->title, _title);     
        strcpy(this->isbn, _isbn);     
    }
    
    ...

 

728x90
728x90
블로그 이미지

coding-restaurant

코딩 맛집에 방문해주셔서 감사합니다.

,

v