I'm FanJae.

[C++ 기본 연습 문제] Chapter 07. 상속(Inheritance)의 이해 본문

C++/Basic Practice

[C++ 기본 연습 문제] Chapter 07. 상속(Inheritance)의 이해

FanJae 2024. 9. 6. 00:02

※ Chapter 06은 별도의 연습 문제가 없었다.

 

1. Chapter 07. 상속(Inheritance)의 이해

1-1. 상속과 생성자의 호출

① 앞서 상속관계에 놓여있는 클래스의 생서앚 정의 및 호출 방식에 대해 설명하였다.

- 이 내용을 바탕으로 다음 클래스에 적절한 생성자를 삽입해보자.

- 그리고 이의 확인을 위한 main 함수를 적절히 정의 해보자.

#include <iostream>
class Car
{
private:
	int gasolineGauge;
public:
	int GetGasGauge()
	{
		return gasolineGauge;
	}
};

class HybridCar : public Car
{
private:
	int eletricGauge;
public:
	int GetElecGague()
	{
		return eletricGauge;
	}
};

class HybridWaterCar : public HybridCar
{
private:
	int waterGauge;
public: 
	void ShowCurrentGauge()
	{
		std::cout << "잔여 가솔린 : " << GetGasGauge() << std::endl;
		std::cout << "잔여 전기량 : " << GetElecGague() << std::endl;
		std::cout << "잔여 워터량 : " << waterGauge << std::endl;
	}
};
#include <iostream>
class Car
{
private:
	int gasolineGauge;
public:
	Car(int gas) : gasolineGauge{ gas }
	{
	}
	int GetGasGauge()
	{
		return gasolineGauge;
	}
};

class HybridCar : public Car
{
private:
	int eletricGauge;
public:
	HybridCar(int gas, int eletric) : Car{gas}, eletricGauge { eletric } 
	{ 
	}
	int GetElecGague()
	{
		return eletricGauge;
	}
};

class HybridWaterCar : public HybridCar
{
private:
	int waterGauge;
public:
	HybridWaterCar(int gas, int eletric, int water) : HybridCar{ gas, eletric }, waterGauge{ water } { } 
	void ShowCurrentGauge()
	{
		std::cout << "잔여 가솔린 : " << GetGasGauge() << std::endl;
		std::cout << "잔여 전기량 : " << GetElecGague() << std::endl;
		std::cout << "잔여 워터량 : " << waterGauge << std::endl;
	}
};

int main()
{
	HybridWaterCar data{ 10,20,30 };
	data.ShowCurrentGauge();
}

 

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

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

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

 

#include <iostream>
#include <cstring>
class MyFriendInfo
{
private:
    char* name;
    int age;
public:
    MyFriendInfo(const char* _name, const int _age) : age{ _age }
    {
        name = new char[strlen(_name) + 1];
        strcpy(name, _name);
    }
    void ShowMyFriendInfo()
    {
        std::cout << "이름 : " << name << std::endl;
        std::cout << "나이 : " << age << std::endl;
    }
    ~MyFriendInfo()
    {
        delete []name;

        std::cout << "MyFriendInfo Done" << std::endl;
    }
};

class MyFriendDetailInfo : public MyFriendInfo
{
private:
    char* addr;
    char* phone;
public:
    MyFriendDetailInfo(const char* _name, const int _age, const char* _addr, const char* _phone) : MyFriendInfo{ _name,_age }
    {
        addr = new char[strlen(_addr) + 1];
        phone = new char[strlen(_phone) + 1];
        strcpy(addr, _addr);
        strcpy(phone, _phone);
    }
    void ShowMyFriendDetailInfo()
    {
        ShowMyFriendInfo();
        std::cout << "주소 : " << addr << std::endl;
        std::cout << "전화 : " << phone << std::endl << std::endl;
    }
    ~MyFriendDetailInfo()
    {
        delete[]addr;
        delete[]phone;

        std::cout << "MyFriendDetailInfo Done" << std::endl;
    }
};

int main(void)
{
    MyFriendDetailInfo data {"FanJae",25,"경기도","010-0000-0000" };
    data.ShowMyFriendDetailInfo();
}

 

1-2. IS-A 관계의 상속

① 정사각형을 의미하는 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 <iostream>
class Rectangle
{
private:
	int x;
	int y;
public:
	Rectangle(int x, int y) : x{ x }, y{ y } { }
	void ShowAreaInfo()
	{
		std::cout << "면적: " << x * y << std::endl;
	}
	~Rectangle() {}
};

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

int main(void)
{
	Rectangle rec(4, 3);
	rec.ShowAreaInfo();

	Square sqr(7);
	sqr.ShowAreaInfo();
	return 0;
}

 

② 책을 의미하는 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 <iostream>
#include <cstring>
class Book
{
private:
    char* title; //책의 제목
    char* isbn; //국제표준도서번호
    int price; //책의 정가
public:
    Book(const char* _title, const char* _isbn, int price) : price{ price }
    {
        title = new char[strlen(_title)+1];
        isbn = new char[strlen(_isbn) + 1];
        strcpy(title, _title);
        strcpy(isbn, _isbn);
    }
    void ShowBookInfo()
    {
        std::cout << "제목 : " << title << std::endl;
        std::cout << "ISBN : " << isbn << std::endl;
        std::cout << "가격 : " << price << std::endl;
    }
};

class Ebook :public Book
{
private:
    char* DRMKey; //보안관련 키
public:
    Ebook(const char* title, const char* isbn, int price, const char* _DRMKey) : Book{title, isbn, price }
    {
        DRMKey = new char[strlen(_DRMKey) + 1];
        strcpy(DRMKey, _DRMKey);
    }
    void ShowEBookInfo()
    {
        ShowBookInfo();
        std::cout << "인증키 : " << DRMKey << std::endl;
    }
};

int main(void)
{
    Book book("좋은 C++", "555-12345-890-0", 20000);
    book.ShowBookInfo();
    std::cout << std::endl;
    Ebook ebook("좋은 C++ ebook", "555-12345-890-1", 10000, "fdx9w0i8kiw");
    ebook.ShowEBookInfo();
    return 0;
}
Comments