하나의 generic abstraction에 여러 개의 추상화를 숨기는 것
예)
Number n1 = Complex (1, 2);
Number n2 = Real (10);
Number n3 = n1 + n2;
Number n2 = n3;
Number이라는 class안에 복소수, 실수를 만들고 그들의 덧셈 등을 포함시킬 수 있다!
struct BaseConstructor { BaseConstructor(int=0) {} };
class RealNumber;
class Complex;
class Number;
class Number
{
friend class RealNumber;
friend class Complex;
public:
//=연산을 만들어 준다.
Number & operator = (const Number &n);
//생성자
Number (const Number &n);
virtual ~Number();
//+연산
virtual Number operator + (Number const &n) const;
//실수 만들기
static Number makeReal (double r);
//허수 만들기
static Number makeComplex (double rpart, double ipart);
protected:
Number ();
Number (BaseConstructor);
private:
//재정의
void redefine (Number *n);
//복소수, 실수 덧셈
virtual Number complexAdd (Complex const &n) const;
virtual Number realAdd (RealNumber const &n) const;
Number *rep;
short referenceCount;
};
class Complex : public Number
{
friend class RealNumber;
friend class Number;
//생성자
Complex (double d, double e);
Complex (const Complex &c);
virtual ~Complex ();
//+연산자, Complex+Real, Complex+Complex
virtual Number operator + (Number const &n) const;
virtual Number realAdd (RealNumber const &n) const;
virtual Number complexAdd (Complex const &n) const;
double rpart, ipart;
};
class RealNumber : public Number
{
friend class Complex;
friend class Number;
//실수 생성자
RealNumber (double r);
RealNumber (const RealNumber &r);
virtual ~RealNumber ();
/+연산자, Real+Real, Real+Complex
virtual Number operator + (Number const &n) const;
virtual Number realAdd (RealNumber const &n) const;
virtual Number complexAdd (Complex const &n) const;
double val;
};
-->각 함수 안의 내용은 간단하므로 적지 않는다.
이를 이용하여 Complex와 RealNumber class가 Number의 class를 상속한다.