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

            Focus on ACE

            訂閱 ace-china
            電子郵件:
            瀏覽存于 groups.google.com 上的所有帖子

            C++博客 首頁(yè) 新隨筆 聯(lián)系 聚合 管理
              64 Posts :: 3 Stories :: 22 Comments :: 0 Trackbacks

            父類的友元不會(huì)自動(dòng)成為子類的友元;而且友元會(huì)破壞封裝;C++的語(yǔ)方不允許(非成員)友元函數(shù)為虛函數(shù)。
            但是,某些時(shí)候,必須通過(guò)友元才能實(shí)現(xiàn)一些操作符重載,如operator<<();如果為每個(gè)子類都實(shí)現(xiàn)operator<<()倒是一個(gè)可行的方法,但是顯得很啰嗦。

            如果能把友元定義為虛函數(shù),則子類可以繼承該友元的接口而無(wú)需重復(fù)聲明友好那該多好啊?
            本文則通過(guò)一種變通的方法巧妙達(dá)到虛函數(shù)的效果。

            //基類 Base.



            #pragma?once
            #include?
            < iostream >
            using ? namespace ?std;
            class ?Base
            {
            public :
            ??Base(
            void );
            ??
            ~ Base( void );
            public :
            ??
            virtual ? void ?print(ostream & ?output)? = ? 0 ;
            ??friend?ostream
            & ? operator ? << (ostream & ?output,Base & ?obj);
            private :
            ??
            char * ?name_;
            ??
            int ?age_;
            }
            ;

            基類的實(shí)現(xiàn) base.cpp
            #include?"StdAfx.h"
            #include?
            ".\base.h"

            Base::Base(
            void)
            {
            ??name_?
            =?"This?is?data1";
            ??age_?
            =?18;
            }


            Base::
            ~Base(void)
            {
            }


            void?Base::print(ostream&?output)
            {
            ??output
            <<"name?=?"?<<name_<<endl;
            ??output
            <<"age?=?"<<age_<<endl;
            }


            ostream
            &?operator<<(ostream&?output,Base&?obj)
            {
            ??obj.print(output);
            ??
            return?output;
            }


            派生類的 Derived.h

            #pragma?once
            #include?
            "Base.h"
            class?Derived?:public?Base
            {
            public:
            ??Derived(
            int?score?=?80);
            ??
            ~Derived(void);
            ??
            virtual?void?print(ostream&?output);
            private:
            ??
            int?score_;
            }
            ;

            派生類的實(shí)現(xiàn) Derived.cpp
            #include?"StdAfx.h"
            #include?
            ".\derived.h"

            Derived::Derived(
            int?score):score_(score)
            {
            ??
            }


            Derived::
            ~Derived(void)
            {
            }


            void?Derived::print(ostream&?output)
            {
            ??Base::print(output);
            ??output
            <<"score?=?"<<score_<<endl;
            }


            主程序main.cpp
            //?Test_VirtualFirendFunction.cpp?:?Defines?the?entry?point?for?the?console?application.
            //

            #include?
            "stdafx.h"
            #include?
            <iostream>
            #include?
            "Derived.h"
            using?namespace?std;
            int?_tmain(int?argc,?_TCHAR*?argv[])
            {
            ??Derived??d;

            ??Derived??d2(
            90);
            ??cout
            <<d<<endl<<d2<<endl;
            ????
            return?0;
            }



            屏幕輸入結(jié)果
            name?=?This?is?data1
            age?=?18
            score?=?80

            name?=?This?is?data1
            age?=?18
            score?=?90

            結(jié)果:
            任何從Base派生類的,都可以利用cout<<obj的機(jī)制通過(guò)流進(jìn)行輸出。

            同樣道理,也可以利用此方法實(shí)現(xiàn)ACE_InputCDR??/ ACE_OutputCDR對(duì)網(wǎng)絡(luò)操作序列化操作。
            (本文也是回答某網(wǎng)友關(guān)于派生類不能重載的問(wèn)題的回復(fù))

            posted on 2006-04-17 22:12 Stone Jiang 閱讀(1795) 評(píng)論(3)  編輯 收藏 引用 所屬分類: ACEC++&OOPMiscellaneous

            Feedback

            # re: 巧用虛友元函數(shù)(原創(chuàng)) 2006-06-07 16:32 paopaoer
            上面的例子我在vs 2005中編譯不過(guò);(  回復(fù)  更多評(píng)論
              

            # re: 巧用虛友元函數(shù)(原創(chuàng)) 2006-06-13 09:22 paopaoer
            原來(lái)是我自己搞錯(cuò)了;)
            忘了繼承  回復(fù)  更多評(píng)論
              

            # re: 巧用虛友元函數(shù)(原創(chuàng)) 2007-10-16 09:37 aiirr
            沒(méi)有必要,用模板解決更合理  回復(fù)  更多評(píng)論
              

            久久综合久久美利坚合众国| 香蕉99久久国产综合精品宅男自| 中文成人久久久久影院免费观看| 久久久久久无码国产精品中文字幕 | 国产欧美一区二区久久| 欧美午夜精品久久久久免费视 | 亚洲国产日韩欧美综合久久| 久久精品国产第一区二区| 午夜精品久久久内射近拍高清 | 性色欲网站人妻丰满中文久久不卡| 综合久久国产九一剧情麻豆| 久久精品一区二区国产| 久久久久噜噜噜亚洲熟女综合| 人妻无码αv中文字幕久久琪琪布 人妻无码精品久久亚瑟影视 | 91久久精品无码一区二区毛片| 久久亚洲精品国产亚洲老地址| 久久久av波多野一区二区| 久久精品成人免费国产片小草 | 色99久久久久高潮综合影院| 久久99精品久久久久久久久久| 久久国产高清一区二区三区| 久久久噜噜噜久久中文福利| 国产69精品久久久久APP下载 | 伊人久久大香线蕉AV色婷婷色 | 亚洲伊人久久综合影院| 大美女久久久久久j久久| 天天躁日日躁狠狠久久| 久久中文精品无码中文字幕| 国产精品一久久香蕉国产线看 | 亚洲精品乱码久久久久久不卡| 亚洲AV无码久久精品蜜桃| 久久久久婷婷| 国产99久久久国产精免费| 久久香综合精品久久伊人| 久久丫忘忧草产品| 中文字幕精品久久久久人妻| 久久国产精品免费一区二区三区 | 日韩人妻无码精品久久久不卡| 一本久久免费视频| 亚洲午夜精品久久久久久app| 欧美激情精品久久久久久久|