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
'C, C++ > 열혈 C++ 프로그래밍' 카테고리의 다른 글
08.상속과 다형성 - 1. 객체 포인터의 참조관계 (0) | 2021.10.08 |
---|---|
[윤성우 열혈 c++] 07.상속의 이해 영상 (0) | 2021.10.07 |
07.상속의 이해 책 (0) | 2021.10.06 |
06. friend와 static 그리고 const (책) (0) | 2021.09.30 |
05.복사생성자(copy constructor) (책) (0) | 2021.09.29 |