fork(3) download
  1. #include <iostream>
  2.  
  3. class Base {
  4. protected:
  5. virtual std::ostream & print(std::ostream& stream) const {
  6. stream << "Base class output\n";
  7. return stream;
  8. }
  9. public:
  10.  
  11. // Define it only for the base class.
  12. friend std::ostream & operator<<(std::ostream & stream, const Base & obj) {
  13. return obj.print(stream);
  14. }
  15.  
  16. virtual ~Base() {}
  17. };
  18.  
  19. class A : public Base {
  20.  
  21. std::ostream & print(std::ostream & stream) const {
  22. this->Base::print(stream);
  23. stream << "foo = " << foo << "\n";
  24. return stream;
  25. }
  26.  
  27. int foo = 0;
  28. public:
  29. ~A() {}
  30. };
  31.  
  32. class B : public Base {
  33.  
  34. std::ostream & print(std::ostream & stream) const {
  35. this->Base::print(stream);
  36. stream << "bar = " << bar << "\n";
  37. return stream;
  38. }
  39.  
  40. int bar = 0;
  41. public:
  42. ~B() {}
  43. };
  44.  
  45.  
  46. int main(int argc, char * argv[]) {
  47. Base * base = new Base();
  48. A * a = new A();
  49. B * b = new B();
  50. Base * a_inside = dynamic_cast<Base *>(a);
  51.  
  52. std::cout << *base << "\n";
  53. std::cout << *a << "\n";
  54. std::cout << *b << "\n";
  55. std::cout << *a_inside << "\n";
  56.  
  57. delete base;
  58. delete a;
  59. delete b;
  60.  
  61. return 0;
  62. }
  63.  
Success #stdin #stdout 0s 4496KB
stdin
Standard input is empty
stdout
Base class output

Base class output
foo = 0

Base class output
bar = 0

Base class output
foo = 0