1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59
| #include <iostream>
#include <ostream>
class Parent {
public:
virtual std::ostream& print(std::ostream& os) const = 0;
};
std::ostream& operator<<(std::ostream& os, Parent const& p)
{
return p.print(os);
}
template <typename T>
class Child: public Parent
{
public:
Child(T const& v) : myValue(v) {}
std::ostream& print(std::ostream& os) const {
return os << myValue;
}
private:
T myValue;
};
class Base
{
public:
template <typename T>
void display(std::ostream& os, T const& v) {
Child<T> c(v);
doDisplay(os, c);
}
protected:
virtual void doDisplay(std::ostream& os, Parent const& p)
{
os << "Base::display(" << p << ")\n";
}
};
class Derived: public Base
{
protected:
virtual void doDisplay(std::ostream& os, Parent const& p)
{
os << "Derived::display(" << p << ")\n";
}
};
int main()
{
Base b;
b.display(std::cout, 3);
b.display(std::cout, 4.2);
Derived d;
d.display(std::cout, 42L);
d.display(std::cout, 'x');
d.display(std::cout, 3.141592);
} |
Partager