-
명품 C++ 9장 3번 4번C++ 2018. 11. 6. 17:26
3~4 다음 추상 클래스 LoopAdder가 있다.
class LoopAdder { // 추상 클래스string name; // 루프의 이름int x, y, sum; // x에서 y까지의 합은 sumvoid read(); // x, y 값을 읽어 들이는 함수void write(); // sum을 출력하는 함수protected:LoopAdder(string name = "") { // 루프의 이름을 받는다. 초깃값은 ""this->name = name;}int getX() { return x; }int getY() { return y; }virtual int calculate() = 0; // 순수 가상 함수. 루프를 돌며 합을 구하는 함수public:void run(); // 연산을 진행하는 함수};void LoopAdder::read() { // x, y 입력cout << name << ":" << endl;cout << "처음 수에서 두번째 수까지 더합니다. 두 수를 입력하세요 >> ";cin >> x >> y;}void LoopAdder::write() { // 결과 sum 출력cout << x << "에서 " << y << "까지의 합 = " << sum << " 입니다" << endl;}void LoopAdder::run() {read(); // x, y를 읽는다.sum = calculate(); // 루프를 돌면서 계산한다.write(); // 결과 sum을 출력한다}3. LoopAdder 클래스를 상속받아 다음 main() 함수와 실해 결과처럼 되도록 ForLoopAdder 클래스를 작성하라. ForLoopAdder 클래스의 calculate() 함수는 for 문을 이용하여 합을 구한다.
소스코드
#include <iostream>#include <string>using namespace std;class LoopAdder { // 추상 클래스string name; // 루프의 이름int x, y, sum; // x에서 y까지의 합은 sumvoid read(); // x, y 값을 읽어 들이는 함수void write(); // sum을 출력하는 함수protected:LoopAdder(string name = "") { // 루프의 이름을 받는다. 초깃값은 ""this->name = name;}int getX() { return x; }int getY() { return y; }virtual int calculate() = 0; // 순수 가상 함수. 루프를 돌며 합을 구하는 함수public:void run(); // 연산을 진행하는 함수};void LoopAdder::read() { // x, y 입력cout << name << ":" << endl;cout << "처음 수에서 두번째 수까지 더합니다. 두 수를 입력하세요 >> ";cin >> x >> y;}void LoopAdder::write() { // 결과 sum 출력cout << x << "에서 " << y << "까지의 합 = " << sum << " 입니다" << endl;}void LoopAdder::run() {read(); // x, y를 읽는다.sum = calculate(); // 루프를 돌면서 계산한다.write(); // 결과 sum을 출력한다}class ForLoopAdder : public LoopAdder {protected:int calculate();public:ForLoopAdder(string name) : LoopAdder(name) {}};int ForLoopAdder::calculate() {int sum = 0;for (int i = getX(); i <= getY(); ++i)sum += i;return sum;}int main() {ForLoopAdder forLoop("For Loop");forLoop.run();}실행결과
순수 가상 함수 calculate 를 파생 클래스에서 구현합니다.
4. LoopAdder 클래스를 상속받아 다음 main() 함수와 실행 결과처럼 되도록 WhileLoopAdder, DoWhileLoopAdder 클래스를 작성하라. while 문, do=while 문을 이용하여 합을 구하도록 calculate() 함수를 각각 작성하면 된다.
소스코드
#include <iostream>#include <string>using namespace std;class LoopAdder { // 추상 클래스string name; // 루프의 이름int x, y, sum; // x에서 y까지의 합은 sumvoid read(); // x, y 값을 읽어 들이는 함수void write(); // sum을 출력하는 함수protected:LoopAdder(string name = "") { // 루프의 이름을 받는다. 초깃값은 ""this->name = name;}int getX() { return x; }int getY() { return y; }virtual int calculate() = 0; // 순수 가상 함수. 루프를 돌며 합을 구하는 함수public:void run(); // 연산을 진행하는 함수};void LoopAdder::read() { // x, y 입력cout << name << ":" << endl;cout << "처음 수에서 두번째 수까지 더합니다. 두 수를 입력하세요 >> ";cin >> x >> y;}void LoopAdder::write() { // 결과 sum 출력cout << x << "에서 " << y << "까지의 합 = " << sum << " 입니다" << endl;}void LoopAdder::run() {read(); // x, y를 읽는다.sum = calculate(); // 루프를 돌면서 계산한다.write(); // 결과 sum을 출력한다}class WhileLoopAdder : public LoopAdder {protected:int calculate();public:WhileLoopAdder(string name) : LoopAdder(name) {}};int WhileLoopAdder::calculate() {int sum = 0;int i = getX();while (i <= getY()) {sum += i;++i;}return sum;}class DoWhileLoopAdder : public LoopAdder {protected:int calculate();public:DoWhileLoopAdder(string name) : LoopAdder(name) {}};int DoWhileLoopAdder::calculate() {int sum = 0;int i = getX();do {sum += i;++i;} while (i <= getY());return sum;}int main() {WhileLoopAdder whileLoop("While Loop");DoWhileLoopAdder doWhileLoop("Do while Loop");whileLoop.run();doWhileLoop.run();}실행결과
순수 가상 함수를 이용하면 오버라이딩을 통해 두 개 이상의 파생클래스에서 이름은 같지만 다른 기능을 가진 함수를 실행 시킬 수 있습니다.
'C++' 카테고리의 다른 글
명품 C++ 9장 6번 (2) 2018.11.06 명품 C++ 9장 5번 (0) 2018.11.06 명품 C++ 9장 1번 2번 (0) 2018.11.06 명품 C++ 8장 Open Challenge (0) 2018.11.04 명품 C++ 8장 9번 (5) 2018.11.04