---------------
class Ival_box {
protected:
    int val;
    int low, high;
    bool changed {false}; // zmieniane przez uytkownika za pomoc funkcji set_value()
public:
    Ival_box(int ll, int hh) :val{ll}, low{ll}, high{hh} { }

    virtual int get_value() { changed = false; return val; }      // dla aplikacji
    virtual void set_value(int i) { changed = true; val = i; }    // dla uytkownika
    virtual void reset_value(int i) { changed = false; val = i; } // dla aplikacji
    virtual void prompt() { }
    virtual bool was_changed() const { return changed; }

    virtual ~Ival_box() {};
};
---------------
void interact(Ival_box* pb)
{
    int old_val = pb->get_value();
    pb->prompt(); // wywietla prob do uytkownika
    //...
    int i = pb->get_value();
    if (i != old_val) {
        //... nowa warto; jakie dziaania...
    }
    else {
        //... jakie inne dziaania...
    }
}

void some_fct()
{
    unique_ptr<Ival_box> p1 {new Ival_slider{0,5}};  // klasa Ival_slider pochodna od klasy Ival_box
    interact(p1.get());
    unique_ptr<Ival_box> p2 {new Ival_dial{1,12}};
    interact(p2.get());
}
---------------
class Ival_slider : public Ival_box {
private:
    //... graficzna reprezentacja suwaka itp.
public:
    Ival_slider(int, int);
    int get_value() override;  // pobiera warto od uytkownika i zapisuje j w val
    void prompt() override;
};
---------------
class Ival_box : public BBwidget { /*...*/}; // zmieniona, by dziedziczy po SGwidget
class Ival_slider : public Ival_box { /*...*/};
class Ival_dial : public Ival_box { /*...*/};
class Flashing_ival_slider : public Ival_slider { /*...*/};
class Popup_ival_slider : public Ival_slider { /*...*/};
---------------
class Ival_box : public BBwidget { /*...*/}; // wersja BB
class Ival_box : public CWwidget { /*...*/}; // wersja CW
class Ival_box : public IBwidget { /*...*/}; // wersja IB
class Ival_box : public LSwindow { /*...*/}; // wersja LS
---------------
class Ival_box {
public:
    virtual int get_value() = 0;
    virtual void set_value(int i) = 0;
    virtual void reset_value(int i) = 0;
    virtual void prompt() = 0;
    virtual bool was_changed() const = 0;
    virtual ~Ival_box() { }
};
---------------
class Ival_slider : public Ival_box, protected BBwidget {
public:
    Ival_slider(int,int);
    ~Ival_slider() override;

    int get_value() override;
    void set_value(int i) override;
    //...
protected:
    //... funkcje przesaniajce funkcje wirtualne klasy BBwidget,
    // np. BBwidget::draw(), BBwidget::mouse1hit() itd.
private:
    //... dane potrzebne suwakowi...
};
---------------
void f(Ival_box* p)
{
    //...
    delete p;
}
---------------
class Ival_box { /*...*/};
class Ival_slider
    : public Ival_box, protected BBwidget { /*...*/};
class Ival_dial
    : public Ival_box, protected BBwidget { /*...*/};
class Flashing_ival_slider
    : public Ival_slider { /*...*/};
class Popup_ival_slider
    : public Ival_slider { /*...*/};
---------------
class Ival_box { /*...*/}; // wsplna
class Ival_slider
    : public Ival_box, protected BBwidget { /*...*/}; // dla BB
class Ival_slider
    : public Ival_box, protected CWwidget { /*...*/}; // dla CW
//...
---------------
class Ival_box { /*...*/};
class BB_ival_slider
    : public Ival_box, protected BBwidget { /*...*/};
class CW_ival_slider
    : public Ival_box, protected CWwidget { /*...*/};
//...
---------------
class Ival_box { /*...*/};
class Ival_slider
    : public Ival_box { /*...*/};
class BB_ival_slider
    : public Ival_slider, protected BBwidget { /*...*/};
class CW_ival_slider
    : public Ival_slider, protected CWwidget { /*...*/};
//...
---------------
class BB_ival_slider
    : public Ival_slider, protected BBslider { /*...*/};
class CW_ival_slider
    : public Ival_slider, protected CWslider { /*...*/};
---------------
class Ival_box { /*...*/};
class Ival_slider
    : public Ival_box { /*...*/};
class Ival_dial
    : public Ival_box { /*...*/};
class Flashing_ival_slider
    : public Ival_slider { /*...*/};
class Popup_ival_slider
    : public Ival_slider { /*...*/};
---------------
class BB_ival_slider
    : public Ival_slider, protected BBslider { /*...*/};
class BB_flashing_ival_slider
    : public Flashing_ival_slider, protected BBwidget_with_bells_and_whistles { /*...*/};
class BB_popup_ival_slider
    : public Popup_ival_slider, protected BBslider { /*...*/};
class CW_ival_slider
    : public Ival_slider, protected CWslider { /*...*/};
//...
---------------
class Ival_maker {
public:
    virtual Ival_dial* dial(int, int) =0;                 // tworzy pokrto
    virtual Popup_ival_slider* popup_slider(int, int) =0; // tworzy wyskakujcy suwak
    //...
};
---------------
class BB_maker : public Ival_maker { // tworzy wersje BB
public:
    Ival_dial* dial(int, int) override;
    Popup_ival_slider* popup_slider(int, int) override;
    //...
};

class LS_maker : public Ival_maker { // tworzy wersje LS
public:
    Ival_dial* dial(int, int) override;
    Popup_ival_slider* popup_slider(int, int) override;
    //...
};
---------------
Ival_dial* BB_maker::dial(int a, int b)
{
    return new BB_ival_dial(a,b);
}

Ival_dial* LS_maker::dial(int a, int b)
{
    return new LS_ival_dial(a,b);
}
---------------
void user(Ival_maker& im)
{
    unique_ptr<Ival_box> pb {im.dial(0,99)}; // tworzy odpowiednie pokrto
    //...
}

BB_maker BB_impl; // dla uytkownikw BB
LS_maker LS_impl; // dla uytkownikw LS

void driver()
{
    user(BB_impl); // uycie BB
    user(LS_impl); // uycie LS
}
---------------
class Comm_sat : public Satellite, public Displayed {
public:
    //...
};
---------------
void f(Comm_sat& s)
{
    s.draw();           // Displayed::draw()
    Pos p = s.center(); // Satellite::center()
    s.transmit();       // Comm_sat::transmit()
}
---------------
void highlight(Displayed*);
Pos center_of_gravity(const Satellite*);

void g(Comm_sat* p)
{
    highlight(p);                 // przekazanie wskanika do czci Displayed klasy Comm_sat
    Pos x = center_of_gravity(p); // przekazanie wskanika do czci Satellite klasy Comm_sat
}
---------------
class Satellite {
public:
    virtual Pos center() const = 0; // rodek cikoci
    //...
};

class Displayed {
public:
    virtual void draw() = 0;
    //...
};

class Comm_sat : public Satellite, public Displayed {
public:
    Pos center() const override;  // przesania Satellite::center()
    void draw() override;         // przesania Displayed::draw()
    //...
};
---------------
class Satellite {
public:
    virtual Debug_info get_debug();
    //...
};
class Displayed {
public:
    virtual Debug_info get_debug();
    //...
};
---------------
void f(Comm_sat& cs)
{
    Debug_info di = cs.get_debug();  // bd: niejednoznaczne
    di = cs.Satellite::get_debug();  // OK
    di = cs.Displayed::get_debug();  // OK
}
---------------
class Comm_sat : public Satellite, public Displayed {
public:
    Debug_info get_debug() // przesania Comm_sat::get_debug() i Displayed::get_debug()
    {
        Debug_info di1 = Satellite::get_debug();
        Debug_info di2 = Displayed::get_debug();
        return merge_info(di1,di2);
    }
    //...
};
---------------
class Telstar : public Comm_sat {
public:
    void draw()
    {
        Comm_sat::draw(); // znajduje Displayed::draw
        //... jaki kod...
    }
    //...
};
---------------
class Satellite : public SimObj {
    // mapuje narzdzia klasy SimObj na co atwiejszego w uyciu przez klas Satellite
public:
    virtual Debug_info get_debug(); // wywouje funkcj SimObj::DBinf() i pobiera informacje
    //...
};
class Displayed : public Widget {
    // mapuje narzdzia klasy Widget na co atwiejszego do uytku w celu wywietlenia wynikw symulacji Satellite
public:
    virtual Debug_info get_debug(); // wczytuje dane z obiektu klasy Widget i tworzy Debug_info
    //...
};
---------------
class Window {
public:
    void draw();  // wywietla obraz
    //...
};
class Cowboy {
public:
    void draw();  // wyjmuje pistolet z kabury
    //...
};
class Cowboy_window : public Cowboy, public Window {
    //...
};
---------------
struct WWindow : Window {
    using Window::Window;                      // dziedziczenie konstruktorw
    virtual void win_draw() = 0;               // wymuszenie przesonicia w klasie pochodnej
    void draw() override final { win_draw(); } // wywietla obraz
};

struct CCowboy : Cowboy{
    using Cowboy::Cowboy;                      // dziedziczenie konstruktorw
    virtual void cow_draw() = 0;               // wymuszenie przesonicia w klasie pochodnej
    void draw() override final { cow_draw(); } // wyjmuje pistolet z kabury
};

class Cowboy_window : public CCowboy, public WWindow {
public:
    void cow_draw() override;
    void win_draw() override;
    //...
};
---------------
struct Storable { // zapisywanie na stae
    virtual string get_file() = 0;
    virtual void read() = 0;
    virtual void write() = 0;
    virtual ~Storable() { }
};
---------------
class Transmitter : public Storable {
public:
    void write() override;
    //...
};

class Receiver : public Storable {
public:
    void write() override;
    //...
};

class Radio : public Transmitter, public Receiver {
public:
    string get_file() override;
    void read() override;
    void write() override;
    //...
};
---------------
void Radio::write()
{
    Transmitter::write();
    Receiver::write();
    //... zapisuje informacje dotyczce radia...
}
---------------
class Storable {
public:
    Storable(const string& s); // zapisuje w pliku o nazwie s
    virtual void read() = 0;
    virtual void write() = 0;
    virtual ~Storable();
protected:
    string file_name;
    Storable(const Storable&) = delete;
    Storable& operator=(const Storable&) = delete;
};
---------------
class Transmitter : public virtual Storable {
public:
    void write() override;
    //...
};

class Receiver : public virtual Storable {
public:
    void write() override;
    //...
};

class Radio : public Transmitter, public Receiver {
public:
    void write() override;
    //...
};
---------------
struct V {
    V(int i);
    //...
};

struct A {
    A(); // konstruktor domylny
    //...
};

struct B : virtual V, virtual A {
    B() :V{1} { /*...*/}; // konstruktor domylny; musi inicjowa baz V
    //...
};

class C : virtual V {
public:
    C(int i) : V{i} { /*...*/}; // musi inicjowa baz V
    //...
};

class D : virtual public B, virtual public C {
    // niejawnie otrzymuje wirtualn klas bazow V z B i C
    // niejawnie otrzymuje wirtualn baz A z B
public:
    D() { /*...*/}             // bd: brak domylnego konstruktora dla C lub V
    D(int i) :C{i} { /*...*/}; // bd: brak domylnego konstruktora dla V
    D(int i, int j) :V{i}, C{j} { /*...*/} // OK
    //...
};
---------------
class Window {
public:
    // podstawowy kod
    virtual void draw();
};
---------------
class Window_with_border : public virtual Window {
    // kod dotyczcy obramowania
protected:
    void own_draw();  // wywietla obramowanie
public:
    void draw() override;
};

class Window_with_menu : public virtual Window {
    // kod dotyczcy menu
protected:
    void own_draw();  // wywietla menu
public:
    void draw() override;
};
---------------
class Clock : public Window_with_border, public Window_with_menu {
    // kod dotyczcy zegara
protected:
    void own_draw();  // wywietla tarcz i wskazwki zegara
public:
    void draw() override;
};
---------------
void Window_with_border::draw()
{
    Window::draw();
    own_draw(); // wywietla obramowanie
}

void Window_with_menu::draw()
{
    Window::draw();
    own_draw(); // wywietla menu
}

void Clock::draw()
{
    Window::draw();
    Window_with_border::own_draw();
    Window_with_menu::own_draw();
    own_draw(); // wywietla tarcz i wskazwki zegara
}
---------------
class BB_ival_slider
    : public Ival_slider, // interfejs
      protected BBslider  // implementacja
{
    // implementacja funkcji wymaganych przez klasy Ival_slider i BBslider przy uyciu narzdzi z klasy BBslider
};
---------------
class BB_ival_slider
    : public virtual Ival_slider, protected BBslider { /*...*/};
class Popup_ival_slider
    : public virtual Ival_slider { /*...*/};
class BB_popup_ival_slider
    : public virtual Popup_ival_slider, protected BB_ival_slider { /*...*/};
---------------
class BB_ival_slider
    : public Ival_slider, protected BBslider { /*...*/};
class Popup_ival_slider
    : public Ival_slider { /*...*/};
class BB_popup_ival_slider
    : public Popup_ival_slider, protected BB_ival_slider { /*...*/};
---------------
void f(Ival_slider*p);
void g(BB_popup_ival_slider*p)
{
    f(p); // bd: Popup_ival_slider::Ival_slider czy BB_ival_slider ::Ival_slider?
}
---------------
Popup_ival_slider* popup_slider_factory(args)
{
    //...
    return new BB_popup_ival_slider(args);
    //...
}
---------------
class Window {
    //...
    virtual void set_color(Color) = 0; // ustawia kolor ta
    virtual void prompt() = 0;
};

class Window_with_border : public virtual Window {
    //...
    void set_color(Color) override;  // kontroluje kolor ta
};

class Window_with_menu : public virtual Window {
    //...
    void prompt() override;  // kontroluje interakcje z uytkownikiem
};

class My_window : public Window_with_menu, public Window_with_border {
    //...
};
---------------
class My_window : public Window_with_menu, public Window_with_border {
    //...
    void prompt() override;  // nie pozostawiaj obsugi interakcji z uytkownikiem w gestii klasy bazowej
};