fork download
  1. #include <iostream>
  2.  
  3. using namespace std;
  4.  
  5. class B{
  6.  
  7. public:
  8.  
  9. virtual void f(){cout << "f() - B" << endl;}
  10. virtual void g(){cout << "g() - B" << endl;}
  11. virtual void h() = 0;
  12. virtual ~B(){cout << "~B() destructor" << endl;}
  13.  
  14. protected:
  15.  
  16. int b;
  17. };
  18.  
  19. class D1: virtual public B{
  20.  
  21. public:
  22.  
  23. void f(){cout << "f() - D1" << endl;}
  24. virtual void g(){cout << "g() - D1" << endl;}
  25. virtual ~D1(){cout << "~D1() destructor" << endl;}
  26.  
  27. protected:
  28.  
  29. int d1;
  30. };
  31.  
  32. class D2: virtual public B{
  33.  
  34. public:
  35.  
  36. void f(int i){cout << "f(" << i << ") - D2" << endl;}
  37. virtual void h(){cout << "h() - D2" << endl;}
  38. virtual ~D2(){cout << "~D2() destructor" << endl;}
  39.  
  40. protected:
  41.  
  42. int d2;
  43. };
  44.  
  45. class D3: public D1{
  46.  
  47. public:
  48. void g(){cout << "g() - D3" << endl;}
  49. void h(){cout << "h() - D3" << endl;}
  50.  
  51. private:
  52.  
  53. int d3;
  54. };
  55.  
  56. class D4: public D1, public D2{
  57.  
  58. public:
  59.  
  60. using D1::f; using D2::f;
  61.  
  62. virtual ~D4(){cout << "~D4() destructor" << endl;}
  63.  
  64. private:
  65.  
  66. int d4;
  67. };
  68.  
  69. void f(B& b){
  70.  
  71. cout << "f() out " << endl;
  72. b.f();
  73. b.g();
  74. b.h();
  75. };
  76.  
  77. int main()
  78. {
  79. B *pB;
  80. D2 d2;
  81. D3 d3;
  82. D4 d4;
  83. f(d2);
  84. f(d3);
  85. f(d4);
  86. d4.D1::f();
  87. d4.f(5);
  88. d4.f(3.7);
  89. d4.g();
  90. d4.h();
  91. pB = new D4;
  92. pB -> f();
  93. dynamic_cast<D4*>(pB)->f(3);
  94. pB -> g();
  95. pB -> h();
  96. delete pB;
  97. }
Success #stdin #stdout 0s 15248KB
stdin
Standard input is empty
stdout
f() out 
f() - B
g() - B
h() - D2
f() out 
f() - D1
g() - D3
h() - D3
f() out 
f() - D1
g() - D1
h() - D2
f() - D1
f(5) - D2
f(3) - D2
g() - D1
h() - D2
f() - D1
f(3) - D2
g() - D1
h() - D2
~D4() destructor
~D2() destructor
~D1() destructor
~B() destructor
~D4() destructor
~D2() destructor
~D1() destructor
~B() destructor
~D1() destructor
~B() destructor
~D2() destructor
~B() destructor