fork download
  1. #include <iostream>
  2. using namespace std;
  3.  
  4. #define SUPER_BASE(clazz) using this_class = clazz
  5.  
  6. #define SUPER(clazz) \
  7. using inherited = this_class; \
  8. using this_class = clazz
  9.  
  10. struct VeryBase
  11. {
  12. SUPER_BASE(VeryBase);
  13.  
  14. virtual void foo() { cout << "foo::VeryBase\n"; }
  15. };
  16.  
  17. struct Derived : public VeryBase
  18. {
  19. SUPER(Derived);
  20.  
  21. void foo() override { inherited::foo(); }
  22. };
  23.  
  24. struct MoreDerived : public Derived
  25. {
  26. SUPER(MoreDerived);
  27.  
  28. MoreDerived()
  29. : inherited()
  30. {}
  31.  
  32. void foo() override { inherited::foo(); }
  33. };
  34.  
  35. void f(VeryBase) { cout << "VeryBase\n"; }
  36. void f(Derived) { cout << "Derived\n"; }
  37. void f(MoreDerived) { cout << "MoreDerived\n"; }
  38.  
  39. int main() {
  40.  
  41. f(MoreDerived::this_class());
  42. f(MoreDerived::inherited());
  43.  
  44. f(Derived::this_class());
  45. f(Derived::inherited());
  46.  
  47. MoreDerived md;
  48. md.foo();
  49.  
  50. return 0;
  51. }
Success #stdin #stdout 0s 3140KB
stdin
Standard input is empty
stdout
MoreDerived
Derived
Derived
VeryBase
foo::VeryBase