/* Copyright (c) 1992 by AT&T Bell Laboratories. */
/* Advanced C++ Programming Styles and Idioms */
/* James O. Coplien */
/* All rights reserved. */

class Telephone {
public:
    void ring();
    Bool isOnHook() isTalking(), isDialing();
    DigitString collectDigits();
    LineNumber extension();
    ~Telephone();
protected:
    Telephone();
    LineNumber extensionData;
};

class POTSPhone : public Telephone {
public:
    Bool runDiagnostics();
    POTSPhone();
    POTSPhone(POTSPhone&);
    ~POTSPhone();
private:
    Frame frameNumberVal;
    Rack rackNumberVal;
    Pair pairVal;
};

class ISDNPhone : public Telephone {
public:
    ISDNPhone();
    ISDNPhone(ISDNPhone&);
    ~ISDNPhone();
    void sendBPacket(), sendDPacket();
private:
    Channel b1, b2, d;
};

class OperatorPhone : public ISDNPhone {
public:
    OperatorPhone();
    OperatorPhone(OperatorPhone&);
    ~OperatorPhone();
    void ring();    // special ringing needed for operator
};

class PrincessPhone : public POTSPhone {
    . . . .
};
