STUDY BLOG

명품 C++ programming Chapter 09 예제 본문

Software/C++

명품 C++ programming Chapter 09 예제

쥬루 2020. 12. 5. 17:40

명품 C++ programming Chapter 09 예제

 

예제 9-1 파생 클래스에서 함수를 재정의하는 사례

#include <iostream>
using namespace std;

class Base {
public:
	void f() { cout << "Base::f() called << endl; }
};

class Derived : public Base {
public:
	void f() { cout << "Derived::f() called" << endl; }
};

void main() {
	Derived d, *pDer;
    pDer = &d;
    pDer -> f();
    
    Base* pBase;
    pBase = pDer;
    pBase->f();
}

 

예제 9-2 오버라이딩과 가상 함수 호출

#include <iostream>
using namespace std;

class Base {
public:
	virtual void f() { cout << "Base::f() called << endl; }
};

class Derived : public Base {
public:
	virtual void f() { cout << "Derived::f() called" << endl; }
};

void main() {
	Derived d, *pDer;
    pDer = &d;
    pDer -> f();
    
    Base* pBase;
    pBase = pDer;
    pBase->f();
}

 

예제 9-3  상속이 반복되는경우 가상 함수 호출

#include <iostream>
using namespace std;

class Base {
public:
	virtual void f() { cout << "Base::f() called << endl; }
};

class Derived : public Base {
public:
	void f() { cout << "Derived::f() called" << endl; }
};

class GrandDerived : public Derived {
public:
	void f() { cout << "GrandDerived::f() called" << endl; }
};

void main() {
	GrandDerived g;
    Base *bp;
    Derived *dp;
    GrandDerived *gp;
    bp = dp = gp = &g;
    
    bp->f();
    dp->f();
    gp->f();
}

 

예제 9-5 소멸자를 가상 함수로 선언

#include <iostream>
using namespace std;

class Base {
public:
	virtual ~Base() { cout << "~Base()" << endl; }
};

class Derived: public Basd {
public:
	virtual ~Derived() { cout << "~Derived()" << endl; }
};

int main() {
	Derived *dp = new Derived();
    Base *bp = new Derived();
    
    delete dp;
    delete bp;
}

 

 

예제 9-6 추상 클래스 구현 연습

#include <iostream>
using namespace std;

class Calculator {
public:
	virtual int add(int a, int b) = 0;
    virtual int substract(int a, int b)=0;
    virtual double average(int a[], int size) =0;
};

class CoodClac : public Calculator {
public:
	int add(int a, int b) { return a+b; }
    int subtract(int a, int b) { return a-b; }
    double average(int a[], int size) {
    	double sum=0;
        for(int i=0; i<size; i++)
        	sum += a[i];
        return sum/size;
    }
};

int main() {
	int a[] = {1,2,3,4,5};
    Calculator *p = new GoodClac();
    cout << p->add(2,3) << endl;
    cout << p->subtract(2,3) << endl;
    cout << p->average(a,5) << endl;
    delete p;
}

 

 

예제 9-7 추상 클래스를 상속받는 파생 클래스 구현 연습

#include <iostream>
using namespace std;

class Calculator {
	void input() {
    	cout << "정수 2개를 입력하세요>> ";
        cin >> a >> b;
    }
    
protected:
	int a, b;
    virtual int calc(int a, int b) =0;
public:
	void run() {
    	input();
        cout << "계산된 값은 " << clac(a,b) << endl;
        }
};

class Adder: public Calculator {
protected:
	int clac(int a, int b) {
    	return a+b;
    }
};

class Subtractor: public Calculator {
protected:
	int clac(int a, int b) {
    	return a-b;
    }
};

int main() {
	Adder adder;
    Substractor substractor;
    
    adder.run();
    subtractor.run();
}