|  | //===-- sbvalue-cast.cpp ----------------------------------------*- C++ -*-===// | 
|  | // | 
|  | //                     The LLVM Compiler Infrastructure | 
|  | // | 
|  | // This file is distributed under the University of Illinois Open Source | 
|  | // License. See LICENSE.TXT for details. | 
|  | // | 
|  | //===----------------------------------------------------------------------===// | 
|  | #include <stdio.h> | 
|  |  | 
|  | class Base | 
|  | { | 
|  | public: | 
|  | Base(int val) : m_base_val (val) {} | 
|  | virtual ~Base() {} | 
|  |  | 
|  | virtual void | 
|  | forcast(int input) { | 
|  | int future_val = m_base_val + input * 1; | 
|  | printf("Forcasting %d\n", future_val); | 
|  | } | 
|  |  | 
|  | protected: | 
|  | int m_base_val; | 
|  | }; | 
|  |  | 
|  | class DerivedA : public virtual Base | 
|  | { | 
|  | public: | 
|  | DerivedA(int val) : Base(val*2), m_a_val(val) { | 
|  | printf("DerivedA::ctor()->\n"); | 
|  | printf("m_base_val=%d\n", m_base_val); | 
|  | printf("m_a_val=%d\n", m_a_val); | 
|  | } | 
|  | virtual ~DerivedA() {} | 
|  |  | 
|  | private: | 
|  | int m_a_val; | 
|  | }; | 
|  |  | 
|  | class DerivedB : public virtual Base | 
|  | { | 
|  | public: | 
|  | DerivedB(int val) : Base(val), m_b_val(val*3) { | 
|  | printf("DerivedB::ctor()->\n"); | 
|  | printf("m_base_val=%d\n", m_base_val); | 
|  | printf("m_b_val=%d\n", m_b_val); | 
|  | } | 
|  | virtual ~DerivedB() {} | 
|  |  | 
|  | virtual void | 
|  | forcast(int input) { | 
|  | int future_val = m_b_val + input * 2; | 
|  | printf("Forcasting %d\n", future_val); | 
|  | } | 
|  |  | 
|  | private: | 
|  | int m_b_val; | 
|  | }; | 
|  |  | 
|  | int | 
|  | main(int argc, char **argv) | 
|  | { | 
|  | Base *array[2] = {new DerivedA(10), new DerivedB(12)}; | 
|  | Base *teller = NULL; | 
|  | for (int i = 0; i < 2; ++i) { | 
|  | teller = array[i]; | 
|  | teller->forcast(i); // Set breakpoint here. | 
|  | } | 
|  |  | 
|  | return 0; | 
|  | } |