Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- std::ostream
- operator overloading
- discord bot
- increment operator
- this call
- vector capacity
- suffix return type
- pointer to member data
- c++ basic practice
- 더 지니어스 양면포커
- member function pointer
- c++ multi chatting room
- std::vector
- std::cout
- vector size
- virtual function
- new&delete
- virtual function table
- virtual inheritance
- virtual destructor
- return by reference
- C++
- diamond inheritance
- dynamic_cast
- delete function
- placement new
- base from member
- constructor
- std::endl
- conversion constructor
Archives
- Today
- Total
I'm FanJae.
[C++ 기본 연습 문제] Chapter 07. 상속(Inheritance)의 이해 본문
※ 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;
}
'C++ > Basic Practice' 카테고리의 다른 글
[C++ 기본 연습 문제] Chapter 10. 연산자 오버로딩 I (0) | 2024.09.08 |
---|---|
[C++ 기본 연습 문제] Chapter 08. 상속과 다형성 (0) | 2024.09.07 |
[C++ 기본 연습 문제] Chapter 05. 복사 생성자(Copy Constructor) (0) | 2024.09.05 |
[C++ 기본 연습 문제] Chapter 04. 클래스의 완성 (0) | 2024.09.04 |
[C++ 기본 연습 문제] Chapter 03. 클래스의 기본 (1) | 2024.09.03 |
Comments