00001 #include <assert.h>
00002 #include <stdio.h>
00003 #include <tr1/memory>
00004
00005
00006
00007
00008 class _BaseFrame {
00009 public:
00010 _BaseFrame() {foo = 1;}
00011 int foo;
00012 };
00013
00014
00015 class BaseFrame {
00016 public:
00017 BaseFrame(_BaseFrame *f) : ptr(f) {}
00018
00019 int foo() {return get()->foo;}
00020 protected:
00021 std::tr1::shared_ptr<_BaseFrame> ptr;
00022 private:
00023 _BaseFrame *get() {return ptr.get();}
00024 };
00025
00026 class BaseSensor {
00027 public:
00028 BaseFrame getFrame() {return getBaseFrame();}
00029 protected:
00030 virtual BaseFrame getBaseFrame() = 0;
00031 };
00032
00033 class _DerivedFrame : public _BaseFrame {
00034 public:
00035 _DerivedFrame() {foo=2; panda=17;}
00036
00037
00038 unsigned panda;
00039 };
00040
00041 class DerivedFrame : public BaseFrame {
00042 public:
00043 DerivedFrame(_DerivedFrame *f) : BaseFrame(f) {}
00044
00045 unsigned panda() {return get()->panda;}
00046 private:
00047 _DerivedFrame *get() {return (_DerivedFrame *)ptr.get();}
00048 };
00049
00050 class DerivedSensor : public BaseSensor {
00051 public:
00052 DerivedFrame getFrame() {
00053 return DerivedFrame(new _DerivedFrame());
00054 }
00055 protected:
00056 virtual BaseFrame getBaseFrame() {
00057 return BaseFrame(getFrame());
00058 }
00059 };
00060
00061
00062 int main(int argc, char **argv) {
00063 printf("%d %d\n", sizeof(BaseFrame), sizeof(DerivedFrame));
00064
00065 DerivedSensor ds;
00066 DerivedFrame df = ds.getFrame();
00067 printf("%d\n", df.foo());
00068
00069 printf("%d\n", df.panda());
00070
00071 BaseFrame bf = ds.getFrame();
00072 printf("%d\n", bf.foo());
00073
00074 BaseSensor &bs = ds;
00075 bf = bs.getFrame();
00076 printf("%d\n", bf.foo());
00077
00078 return 0;
00079 };