#include <iostream>
using namespace std;
class Variable {
virtual void display() { cout <<"Oops, try to display variable ..."<<endl; }
};
class Number : public Variable {};
class Boolean : public Variable {};
class RealNumber : public Number {};
class IntegerNumber : public Number {
protected:
int val;
public:
IntegerNumber(int v=0): val(v) {}
void display() override { cout <<"Display integer "<<val<<endl; }
};
class Virtuality {
public:
virtual void compute_virtual_value() { cout <<"I compute my virtual value...\n"; }
};
class VirtualVariable : public Variable, public Virtuality {};
class VirtualNumber : public Number, public Virtuality {};
class VirtualBoolean : public Boolean, public Virtuality {};
class VirtualRealNumber : public RealNumber, public Virtuality {};
class VirtualIntegerNumber : public IntegerNumber, public Virtuality {
public:
void compute_virtual_value() override { cout <<"I compute my virtual INTEGER value...\n"; val=1000; }
void display() override {
compute_virtual_value();
cout <<"....Display virtual integer "<<val<<endl;
}
};
IntegerNumber add (IntegerNumber &a, IntegerNumber&b) {
cout << "add:\n";
cout << " "; a.display();
cout << " "; b.display();
return IntegerNumber(-1); // ok, must be elaborated a little bit more here ;-)
}
int main() {
IntegerNumber n(27); // number with an inital value
VirtualIntegerNumber k; // value will be calculated from some formula
add (n, k);
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKY2xhc3MgVmFyaWFibGUgewoJCXZpcnR1YWwgdm9pZCBkaXNwbGF5KCkgeyBjb3V0IDw8Ik9vcHMsIHRyeSB0byBkaXNwbGF5IHZhcmlhYmxlIC4uLiI8PGVuZGw7IH0KfTsKY2xhc3MgTnVtYmVyIDogcHVibGljIFZhcmlhYmxlIHt9OwpjbGFzcyBCb29sZWFuIDogcHVibGljIFZhcmlhYmxlIHt9OwpjbGFzcyBSZWFsTnVtYmVyIDogcHVibGljIE51bWJlciB7fTsKY2xhc3MgSW50ZWdlck51bWJlciA6IHB1YmxpYyBOdW1iZXIgewpwcm90ZWN0ZWQ6CglpbnQgdmFsOyAKcHVibGljOiAKCUludGVnZXJOdW1iZXIoaW50IHY9MCk6IHZhbCh2KSB7fQoJdm9pZCBkaXNwbGF5KCkgb3ZlcnJpZGUgeyBjb3V0IDw8IkRpc3BsYXkgaW50ZWdlciAiPDx2YWw8PGVuZGw7IH0KCX07CgpjbGFzcyBWaXJ0dWFsaXR5ICB7IApwdWJsaWM6Cgl2aXJ0dWFsIHZvaWQgY29tcHV0ZV92aXJ0dWFsX3ZhbHVlKCkgeyBjb3V0IDw8IkkgY29tcHV0ZSBteSB2aXJ0dWFsIHZhbHVlLi4uXG4iOyB9Cgl9OyAgICAgCmNsYXNzIFZpcnR1YWxWYXJpYWJsZSA6IHB1YmxpYyBWYXJpYWJsZSwgcHVibGljIFZpcnR1YWxpdHkgIHt9OwpjbGFzcyBWaXJ0dWFsTnVtYmVyIDogcHVibGljIE51bWJlciwgcHVibGljIFZpcnR1YWxpdHkgIHt9OwpjbGFzcyBWaXJ0dWFsQm9vbGVhbiA6IHB1YmxpYyBCb29sZWFuLCBwdWJsaWMgVmlydHVhbGl0eSAge307CmNsYXNzIFZpcnR1YWxSZWFsTnVtYmVyIDogcHVibGljIFJlYWxOdW1iZXIsIHB1YmxpYyBWaXJ0dWFsaXR5ICB7fTsKY2xhc3MgVmlydHVhbEludGVnZXJOdW1iZXIgOiBwdWJsaWMgSW50ZWdlck51bWJlciwgcHVibGljIFZpcnR1YWxpdHkgIHsKcHVibGljOgoJdm9pZCBjb21wdXRlX3ZpcnR1YWxfdmFsdWUoKSBvdmVycmlkZSB7IGNvdXQgPDwiSSBjb21wdXRlIG15IHZpcnR1YWwgSU5URUdFUiB2YWx1ZS4uLlxuIjsgdmFsPTEwMDA7IH0KCXZvaWQgZGlzcGxheSgpIG92ZXJyaWRlIHsgCgkJY29tcHV0ZV92aXJ0dWFsX3ZhbHVlKCk7IAoJCWNvdXQgPDwiLi4uLkRpc3BsYXkgdmlydHVhbCBpbnRlZ2VyICI8PHZhbDw8ZW5kbDsgCgl9Cn07CgpJbnRlZ2VyTnVtYmVyIGFkZCAoSW50ZWdlck51bWJlciAmYSwgSW50ZWdlck51bWJlciZiKSB7Cgljb3V0IDw8ICJhZGQ6XG4iOyAKCWNvdXQgPDwgIiAgICI7IGEuZGlzcGxheSgpOyAKCWNvdXQgPDwgIiAgICI7IGIuZGlzcGxheSgpOyAKCXJldHVybiBJbnRlZ2VyTnVtYmVyKC0xKTsgICAvLyBvaywgbXVzdCBiZSBlbGFib3JhdGVkIGEgbGl0dGxlIGJpdCBtb3JlIGhlcmUgOy0pCn0KCmludCBtYWluKCkgewoJSW50ZWdlck51bWJlciBuKDI3KTsgIC8vIG51bWJlciB3aXRoIGFuIGluaXRhbCB2YWx1ZQoJVmlydHVhbEludGVnZXJOdW1iZXIgazsgICAvLyB2YWx1ZSB3aWxsIGJlIGNhbGN1bGF0ZWQgZnJvbSBzb21lIGZvcm11bGEgCglhZGQgKG4sIGspOwoJCglyZXR1cm4gMDsKfQ==