• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            EverSpring working shop

            To pursue creative ideas based on nature.

            統計

            留言簿(1)

            他山之石

            閱讀排行榜

            評論排行榜

            Some notes about dynamic polymorphism (by virtual) and static polymorphism (by template)

            The time and space cost by the late binding (dynamic polymorphism), which is mainly implemented by Virtual Functions, is more than the static polymorphism, mainly implemented by the Template usage. This is because the compiler needs to allocate speical VPTR and VTABLE for each class with virtual function denoted. And duirng the compiling time, the original code is expanded by adding the code locating the virtual functiona address in the VTABLE, at each place the base class pointer/reference are passed?as parameter in?other function call. Finally, at the running time, such extra?code absolutely costs extra time, especially when the base class pointer/referece are passed as parms very frequently.? We can consider to use the template in such sitations like:
              • The context is using the Set of the objects instead of the pointer/reference, and the objects of this set have common behavior at a level of abstraction. The typical application is the Containers design in the STL.
              • The algorithem or behavior of different objects has some common attribute and this common attributes can be determined at compiling time.
              • Policy based programming, and such policy selection can be determined by the client at the compiling time. Refer to MCppD.
              • Very senstive to the requirements on efficiency of time or space.
            Must be noted: The bahavior must be determined at the compiling time if using the Template Polymorphism. This means the the client must have the type information explicitly during the code construction time. From this point, we may say the in Template Polymorphism, the CLIENT is the usually in design scope of application because it?is?responsible for the Template Specialization. As to the Dynamic, the?CLIENT?is more in the design scope for the framework, not care of the concrete type information in operation.
            Here give an example explaining the usage of the dynamic/static polymorphism:
            ?
            #include <iostream>
            using namespace std;
            ?

            /*
            ?* =====================================================================================
            ?*??????? Class:? base_d
            ?*? Description:?
            ?* =====================================================================================
            ?*/
            class base_d
            {
            ?
            ? public:
            ?
            ??? /* ====================? LIFECYCLE?? ========================================= */
            ?
            ??? base_d ();? /* constructor */
            ?
            ??? /* Use compiler-generated copy constructor, assignment operator and destructor */
            ?
            ??? /* ====================? OPERATORS?? ========================================= */
            ?
            ??? /* ====================? OPERATIONS? ========================================= */
            ??? virtual void dosomething() = 0;
            ??? /* ====================? ACCESS????? ========================================= */
            ?
            ??? /* ====================? INQUIRY???? ========================================= */
            ?
            ? protected:
            ?
            ? private:
            ?
            }; /* -----? end of class? base_d? ----- */
            ?
            /*
            ?*--------------------------------------------------------------------------------------
            ?*?????? Class:? base_d
            ?*????? Method:? base_d
            ?* Description:? constructor
            ?*--------------------------------------------------------------------------------------
            ?*/
            base_d::base_d ()
            {
            }? /* -----? end of method base_d::base_d? (constructor)? ----- */
            ?

            /*
            ?* =====================================================================================
            ?*??????? Class:? client_d
            ?*? Description:?
            ?* =====================================================================================
            ?*/
            class client_d
            {
            ?
            ? public:
            ?
            ??? /* ====================? LIFECYCLE?? ========================================= */
            ?
            ??? client_d (base_d*);? /* constructor */
            ?
            ??? /* Use compiler-generated copy constructor, assignment operator and destructor */
            ?
            ??? /* ====================? OPERATORS?? ========================================= */
            ?
            ??? /* ====================? OPERATIONS? ========================================= */
            ?
            ??? /* ====================? ACCESS????? ========================================= */
            ??? void get_do();
            ??? /* ====================? INQUIRY???? ========================================= */
            ?
            ? protected:
            ?
            ? private:
            ??? base_d* ptr_b;
            ?
            }; /* -----? end of class? client_d? ----- */
            ?
            /*
            ?*--------------------------------------------------------------------------------------
            ?*?????? Class:? client_d
            ?*????? Method:? client_d
            ?* Description:? constructor
            ?*--------------------------------------------------------------------------------------
            ?*/
            client_d::client_d (base_d* pb):ptr_b(pb)
            {
            }? /* -----? end of method client_d::client_d? (constructor)? ----- */
            ?

            void
            client_d::get_do (? )
            {
            ?ptr_b->dosomething();
            }??/* -----? end of method client_d::get_do? ----- */
            ?

            /*
            ?* =====================================================================================
            ?*??????? Class:? der1_d
            ?*? Description:?
            ?* =====================================================================================
            ?*/
            class der1_d : public base_d
            {
            ?
            ? public:
            ?
            ??? /* ====================? LIFECYCLE?? ========================================= */
            ?
            ??? der1_d ();? /* constructor */
            ?
            ??? /* Use compiler-generated copy constructor, assignment operator and destructor */
            ?
            ??? /* ====================? OPERATORS?? ========================================= */
            ?
            ??? /* ====================? OPERATIONS? ========================================= */
            ??? virtual void dosomething();
            ??? /* ====================? ACCESS????? ========================================= */
            ?
            ??? /* ====================? INQUIRY???? ========================================= */
            ?
            ? protected:
            ?
            ? private:
            ?
            }; /* -----? end of class? der1_d? ----- */
            ?
            /*
            ?*--------------------------------------------------------------------------------------
            ?*?????? Class:? der1_d
            ?*????? Method:? der1_d
            ?* Description:? constructor
            ?*--------------------------------------------------------------------------------------
            ?*/
            der1_d::der1_d ()
            {
            }? /* -----? end of method der1_d::der1_d? (constructor)? ----- */
            ?

            void
            der1_d::dosomething (? )
            {
            ??? cout <<"\n this is der1_d is doing something!\n";
            }??/* -----? end of method der1_d::dosoming? ----- */
            ?

            /*
            ?* =====================================================================================
            ?*??????? Class:? der2_d
            ?*? Description:?
            ?* =====================================================================================
            ?*/
            class der2_d : public base_d
            {
            ?
            ? public:
            ?
            ??? /* ====================? LIFECYCLE?? ========================================= */
            ?
            ??? der2_d ();? /* constructor */
            ?
            ??? /* Use compiler-generated copy constructor, assignment operator and destructor */
            ?
            ??? /* ====================? OPERATORS?? ========================================= */
            ?
            ??? /* ====================? OPERATIONS? ========================================= */
            ??? virtual void dosomething();
            ??? /* ====================? ACCESS????? ========================================= */
            ?
            ??? /* ====================? INQUIRY???? ========================================= */
            ?
            ? protected:
            ?
            ? private:
            ?
            }; /* -----? end of class? der2_d? ----- */
            ?
            /*
            ?*--------------------------------------------------------------------------------------
            ?*?????? Class:? der2_d
            ?*????? Method:? der2_d
            ?* Description:? constructor
            ?*--------------------------------------------------------------------------------------
            ?*/
            der2_d::der2_d ()
            {
            }? /* -----? end of method der2_d::der2_d? (constructor)? ----- */
            ?

            void
            der2_d::dosomething (? )
            {
            ??? cout <<"\n this is der2_d is doing something!\n";
            }??/* -----? end of method der2_d::dosomething? ----- */
            ?

            /*
            ?* =====================================================================================
            ?*??????? Class:? client_s
            ?*? Description:?
            ?* =====================================================================================
            ?*/
            template < class T >
            class client_s
            {
            ?
            ? public:
            ?
            ??? /* ====================? LIFECYCLE?? ========================================= */
            ?
            ??? client_s (T* );?? /* constructor */
            ?
            ??? /* Use compiler-generated copy constructor, assignment operator and destructor */
            ?
            ??? /* ====================? OPERATORS?? ========================================= */
            ?
            ??? /* ====================? OPERATIONS? ========================================= */
            ??? void get_do();
            ??? /* ====================? ACCESS????? ========================================= */
            ?
            ??? /* ====================? INQUIRY???? ========================================= */
            ?
            ? protected:
            ?
            ? private:
            ??? T* ptr_t;
            }; /* ----------? end of template class? client_s? ---------- */
            ?
            /*
            ?*--------------------------------------------------------------------------------------
            ?*?????? Class:? client_s
            ?*????? Method:? client_s
            ?* Description:?
            ?*--------------------------------------------------------------------------------------
            ?*/
            template < class T >
            client_s < T >::client_s (T* pt):ptr_t(pt)
            {
            }? /* ----------? end of constructor of template class client_s? ---------- */
            ?
            template < class T>
            void
            client_s<T>::get_do (? )
            {
            ?ptr_t->dosomething();
            }??/* -----? end of method client_s::get_do? ----- */
            ?

            /*
            ?* =====================================================================================
            ?*??????? Class:? der1_s
            ?*? Description:?
            ?* =====================================================================================
            ?*/
            class der1_s
            {
            ?
            ? public:
            ?
            ??? /* ====================? LIFECYCLE?? ========================================= */
            ?
            ??? der1_s ();? /* constructor */
            ?
            ??? /* Use compiler-generated copy constructor, assignment operator and destructor */
            ?
            ??? /* ====================? OPERATORS?? ========================================= */
            ?
            ??? /* ====================? OPERATIONS? ========================================= */
            ??? void dosomething();
            ??? /* ====================? ACCESS????? ========================================= */
            ?
            ??? /* ====================? INQUIRY???? ========================================= */
            ?
            ? protected:
            ?
            ? private:
            ?
            }; /* -----? end of class? der1_s? ----- */
            ?
            /*
            ?*--------------------------------------------------------------------------------------
            ?*?????? Class:? der1_s
            ?*????? Method:? der1_s
            ?* Description:? constructor
            ?*--------------------------------------------------------------------------------------
            ?*/
            der1_s::der1_s ()
            {
            }? /* -----? end of method der1_s::der1_s? (constructor)? ----- */
            ?

            void
            der1_s::dosomething (? )
            {
            ??? cout <<"\n this is der1_s doing something!\n" ;
            }??/* -----? end of method der1_s::dosomething? ----- */
            ?

            /*
            ?* =====================================================================================
            ?*??????? Class:? der2_s
            ?*? Description:?
            ?* =====================================================================================
            ?*/
            class der2_s
            {
            ?
            ? public:
            ?
            ??? /* ====================? LIFECYCLE?? ========================================= */
            ?
            ??? der2_s ();? /* constructor */
            ?
            ??? /* Use compiler-generated copy constructor, assignment operator and destructor */
            ?
            ??? /* ====================? OPERATORS?? ========================================= */
            ?
            ??? /* ====================? OPERATIONS? ========================================= */
            ??? void dosomething();
            ??? /* ====================? ACCESS????? ========================================= */
            ?
            ??? /* ====================? INQUIRY???? ========================================= */
            ?
            ? protected:
            ?
            ? private:
            ?
            }; /* -----? end of class? der2_s? ----- */
            ?
            /*
            ?*--------------------------------------------------------------------------------------
            ?*?????? Class:? der2_s
            ?*????? Method:? der2_s
            ?* Description:? constructor
            ?*--------------------------------------------------------------------------------------
            ?*/
            der2_s::der2_s ()
            {
            }? /* -----? end of method der2_s::der2_s? (constructor)? ----- */
            ?

            void
            der2_s::dosomething (? )
            {
            ?cout<<"\n this is der2_s doing something!\n" ;
            }??/* -----? end of method der2_s::dosomething? ----- */
            ?

            int main()
            {
            ?? // Dynamic Polymorphism example:
            ?? base_d * ptr_1 = new der1_d;
            ?? base_d * ptr_2 = new der2_d;
            ?
            ?? client_d * ptr_c_1 = new client_d(ptr_1);
            ?? client_d * ptr_c_2 = new client_d(ptr_2);
            ?
            ?? ptr_c_1 -> get_do();
            ?? ptr_c_2 -> get_do();
            ?
            ?? // Static Polymorphism example:
            ?? der1_s * ptr_3 = new der1_s;
            ?? der2_s * ptr_4 = new der2_s;
            ??
            ?? client_s<der1_s> obj_client_1(ptr_3);
            ?? client_s<der2_s> obj_client_2(ptr_4);
            ?
            ?? obj_client_1.get_do();
            ?? obj_client_2.get_do();
            ?
            ?? return 0;
            }
            testing out:
            [alexzh@alexzhang_lnx d_s_poly]$ ./a.out
            ?
            ?this is der1_d is doing something!
            ?
            ?this is der2_d is doing something!
            ?
            ?this is der1_s doing something!
            ?
            ?this is der2_s doing something!

            posted on 2009-03-08 17:25 everspring79 閱讀(381) 評論(0)  編輯 收藏 引用 所屬分類: Notes

            美女写真久久影院| 久久国产AVJUST麻豆| 99久久免费国产精精品| 久久综合中文字幕| 午夜精品久久久久久久无码| 伊人久久大香线蕉av不变影院| 2021久久国自产拍精品| 久久人妻少妇嫩草AV蜜桃| 精品国产VA久久久久久久冰| 国产精品99久久久久久www| 色青青草原桃花久久综合| 久久国产精品一区二区| 国产精品久久久香蕉| 国产精品免费久久久久电影网| 欧美亚洲国产精品久久高清 | 99久久免费国产特黄| 久久精品无码专区免费| 久久久久99精品成人片直播| 亚洲精品NV久久久久久久久久| 色综合久久中文综合网| 久久综合噜噜激激的五月天| 日韩亚洲国产综合久久久| 91久久香蕉国产熟女线看| 久久午夜无码鲁丝片| 久久久久国产精品嫩草影院| 久久国产香蕉一区精品| 国产精品熟女福利久久AV| 久久精品国产精品国产精品污| 久久久久精品国产亚洲AV无码| 综合久久精品色| 久久亚洲sm情趣捆绑调教| 性做久久久久久久久老女人| a级毛片无码兔费真人久久| 嫩草影院久久国产精品| 久久综合九色综合97_久久久| 久久精品国产亚洲av水果派 | 亚洲一区二区三区日本久久九| 人妻无码αv中文字幕久久琪琪布| 国内精品伊人久久久影院| 欧美日韩精品久久久久| 亚洲狠狠婷婷综合久久久久|