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