xref: /llvm-project/lldb/test/API/lang/cpp/dynamic-value/sbvalue-cast.cpp (revision fdea9a4ec9b0d9585b8fe8a612686d9f44f40ddc)
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