1 #ifdef DO_VIRTUAL_INHERITANCE
2 #define VIRTUAL virtual
3 #else
4 #define VIRTUAL
5 #endif
6 
7 #include <stdio.h>
8 
9 class Base
10 {
11 public:
Base(int val)12     Base(int val) : m_base_val (val) {}
~Base()13     virtual ~Base() {}
14 
15     virtual void
forcast(int input)16     forcast(int input) {
17         int future_val = m_base_val + input * 1;
18         printf("Forcasting %d\n", future_val);
19     }
20 
21 protected:
22     int m_base_val;
23 };
24 
25 class DerivedA : public VIRTUAL Base
26 {
27 public:
DerivedA(int val)28     DerivedA(int val) : Base(val*2), m_a_val(val) {
29         printf("DerivedA::ctor()->\n");
30         printf("m_base_val=%d\n", m_base_val);
31         printf("m_a_val=%d\n", m_a_val);
32     }
~DerivedA()33     virtual ~DerivedA() {}
34 
35 private:
36     int m_a_val;
37 };
38 
39 class DerivedB : public VIRTUAL Base
40 {
41 public:
DerivedB(int val)42     DerivedB(int val) : Base(val), m_b_val(val*3) {
43         printf("DerivedB::ctor()->\n");
44         printf("m_base_val=%d\n", m_base_val);
45         printf("m_b_val=%d\n", m_b_val);
46     }
~DerivedB()47     virtual ~DerivedB() {}
48 
49     virtual void
forcast(int input)50     forcast(int input) {
51         int future_val = m_b_val + input * 2;
52         printf("Forcasting %d\n", future_val);
53     }
54 
55 private:
56     int m_b_val;
57 };
58 
59 int
main(int argc,char ** argv)60 main(int argc, char **argv)
61 {
62 	DerivedA* dA = new DerivedA(10);
63 	DerivedB* dB = new DerivedB(12);
64 	Base *array[2] = {dA, dB};
65     Base *teller = NULL;
66     for (int i = 0; i < 2; ++i) {
67         teller = array[i];
68         teller->forcast(i); // Set breakpoint here.
69     }
70 
71     return 0;
72 }
73