• <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.

            統(tǒng)計

            留言簿(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 閱讀(382) 評論(0)  編輯 收藏 引用 所屬分類: Notes

            精品综合久久久久久97| 久久人人爽人人澡人人高潮AV| 精品久久久久成人码免费动漫| 久久精品国产男包| 2021少妇久久久久久久久久| 亚洲精品高清久久| 久久人人爽人人爽人人片AV东京热 | 婷婷综合久久中文字幕| 久久嫩草影院免费看夜色| 久久精品aⅴ无码中文字字幕不卡 久久精品成人欧美大片 | 国产成人久久久精品二区三区| 久久久久国色AV免费看图片| 亚洲综合伊人久久综合| 伊人久久大香线蕉精品| 久久久久久国产精品美女| 国产L精品国产亚洲区久久| 97精品依人久久久大香线蕉97 | 精品久久久久久国产牛牛app| 久久精品国产男包| 久久九九免费高清视频| 久久九九青青国产精品| 亚洲国产精品无码久久98| 四虎亚洲国产成人久久精品| 亚洲国产精品久久66| 99久久中文字幕| 日韩久久久久久中文人妻| 四虎国产精品成人免费久久| A级毛片无码久久精品免费| a级成人毛片久久| 国内精品久久久久久99| 无码日韩人妻精品久久蜜桃| 久久人人爽人人爽人人片AV高清| 久久国产视频网| 久久久久久久亚洲精品| 久久久久亚洲精品男人的天堂| 伊人色综合久久| 国产精品综合久久第一页| 99热都是精品久久久久久| 国产精品免费久久久久电影网| 国产激情久久久久影院| 99久久人人爽亚洲精品美女|