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

            C++ Programmer's Cookbook

            {C++ 基礎(chǔ)} {C++ 高級} {C#界面,C++核心算法} {設(shè)計模式} {C#基礎(chǔ)}

            虛函數(shù) 多重繼承的構(gòu)造函數(shù)的調(diào)用,虛函數(shù)地址的找法

            虛函數(shù)地址的找法:

            #include "stdafx.h"
            #include 
            <iostream>
            using namespace std;
            class CBase
            {
            public:
                
            virtual void who(){cout<<"CBase"<<endl;}
            }
            ;
            class CDerived:public CBase
            {
            public:
                
            virtual void who(){cout<<"CDerived"<<endl;}
            }
            ;
            int _tmain(int argc, _TCHAR* argv[])
            {
                
            long num1=0;
                
            long num2=0;
                CBase 
            *base=new CBase;//必須用new后,才可以找到
                CDerived *derived=new CDerived;
                num1
            =*(long*)(*(long*)base);//找到第一個虛函數(shù)的地址
                num2=*(long*)(*(long*)derived);
                cout
            <<num1<<endl;
                cout
            <<num2<<endl;
                
            return 0;
            }


            #include "stdafx.h"
            #include <iostream>
            using namespace std;
            class CBase
            {
            public:
             virtual void who(){cout<<"CBase"<<endl;}
            };
            class CDerived:public CBase
            {
            public:
             virtual void who(){cout<<"CDerived"<<endl;}
            };
            int _tmain(int argc, _TCHAR* argv[])
            {
             long num1=0;
             long num2=0;
             CBase *base=new CBase;//必須用new后,才可以找到
             CDerived *derived=new CDerived;
             num1=*(long*)(*(long*)base);//找到第一個虛函數(shù)的地址
             num2=*(long*)(*(long*)derived);
             cout<<num1<<endl;
             cout<<num2<<endl;
             return 0;
            }

            ---------------------------------------
            虛函數(shù)的定義要遵循以下重要規(guī)則:

              1.如果虛函數(shù)在基類與派生類中出現(xiàn),僅僅是名字相同,而形式參數(shù)不同,或者是返回類型不同,那么即使加上了virtual關(guān)鍵字,也是不會進行滯后

            聯(lián)編的。

              2.只有類的成員函數(shù)才能說明為虛函數(shù),因為虛函數(shù)僅適合用與有繼承關(guān)系的類對象,所以普通函數(shù)不能說明為虛函數(shù)。

              3.靜態(tài)成員函數(shù)不能是虛函數(shù),因為靜態(tài)成員函數(shù)的特點是不受限制于某個對象。

              4.內(nèi)聯(lián)(inline)函數(shù)不能是虛函數(shù),因為內(nèi)聯(lián)函數(shù)不能在運行中動態(tài)確定位置。即使虛函數(shù)在類的內(nèi)部定義定義,但是在編譯的時候系統(tǒng)仍然將它看做是非內(nèi)聯(lián)的。

              5.構(gòu)造函數(shù)不能是虛函數(shù),因為構(gòu)造的時候,對象還是一片位定型的空間,只有構(gòu)造完成后,對象才是具體類的實例。

              6.析構(gòu)函數(shù)可以是虛函數(shù),而且通常聲名為虛函數(shù)。
            ------------------------------------

            1)Derived:public Base

              
                    CBase  pBase;
             CDerived pDerived;
             CBase *pBase2= new CDerived;
                    delete pBase2;
             CDerived pDerived2;

                            //results:             
                     //CBase::CBase               // CBase  pBase;
              //CBase::CBase               //CDerived pDerived;
              //CDerived:: CDerived
              //CBase::CBase               //CBase *pBase2= new CDerived;
              //CDerived:: CDerived
              //CBase::~CBase              // delete pBase2;//因為基類的析構(gòu)不是虛,如                                                                是則先調(diào)用子類的析構(gòu)
              //CBase::CBase               //CDerived pDerived2;
              //CDerived:: CDerived       
              //CDerived::~CDerived         //CDerived pDerived2;   
              //CBase::~CBase
              //CDerived::~CDerived         //CDerived pDerived;  
              //CBase::~CBase
              //CBase::~CBase               //CBase  pBase;    
              //Press any key to continue


                 如果是子類構(gòu)造先基類,再子類
                 如果是子類析構(gòu)先子類,再基類
                 但如果基類析構(gòu)不是虛,則CBase *pBase2= new CDerived;
                         delete pBase2;只調(diào)用基類.否則如果基類析構(gòu)是虛,則先調(diào)用子類,再調(diào)用基類。
                 如果是用new初始化的,必須用delete來釋放,否則不調(diào)用析構(gòu)函數(shù)。

                 CDerived pDerived(10);//the base class must be have the defaut constructor


            //CBase::CBase
            //this is defuat  constructor function
            //CDerived:: CDerived
            //CDerived::~CDerived
            //CBase::~CBase
            //CBase::~CBase
            //Press any key to continue


            如果子類中有基類的對象成員,則先調(diào)用基類的構(gòu)造函數(shù),再調(diào)用基類的構(gòu)造函數(shù)對基類的對象成員初始化,最后才調(diào)用子類的構(gòu)造函數(shù),析構(gòu)正好順序相反。

             


            2)CBase1:public  CBase
              CBase2:public  CBase
              CDervied:public  CBase1,CBase2

            CDerived  pdereved;

            如果沒有定義為虛繼承 ,先調(diào)用基類再子類然后再基類再子類最后才調(diào)用子子類構(gòu)造。
            CBase::CBase()!
            CBase1::CBase()!
            CBase::CBase()!
            CBase2::CBase()!
            CDerived::CDerived()!
            CDerived::~CDerived()!
            CBase2::~CBase()!
            CBase::~CBase()!
            CBase1::~CBase()!
            CBase::~CBase()!
            Press any key to continue

            如果cbase1與cbase2是虛繼承cbase,則只調(diào)用一次基類
            CBase::CBase()!
            CBase1::CBase()!
            CBase2::CBase()!
            CDerived::CDerived()!
            CDerived::~CDerived()!
            CBase2::~CBase()!
            CBase1::~CBase()!
            CBase::~CBase()!
            Press any key to continue

            -----------------------------------
            多重繼承的成員調(diào)用:


              cbase
              CBase1:public  CBase
              CBase2:public  CBase
              CDervied:public  CBase1,CBase2
            1)當(dāng)cbase1與cbase2不是虛繼承的時:dervied不能訪問基類繼承而來(即共有的)的任何成員,不能識別。

            2)當(dāng)cbase1與cbase2是虛繼承的時,dervied可以訪問cbase中沒有1和2重新定義的成員,也能訪問只被1或只被2重新定義的成員,這是調(diào)用1或2中的成員,當(dāng)dervied中有重寫時,調(diào)用derived中重新定義的成員。(共有)

            :保證我們在不考慮繼承而來的隱藏成員時,能夠識別該調(diào)用那個類中的!則編譯器也能識別!
            3)
            在調(diào)用變量的時候,要指出時屬于那個類。


             

            posted on 2005-11-09 12:58 夢在天涯 閱讀(1683) 評論(0)  編輯 收藏 引用 所屬分類: CPlusPlus

            公告

            EMail:itech001#126.com

            導(dǎo)航

            統(tǒng)計

            • 隨筆 - 461
            • 文章 - 4
            • 評論 - 746
            • 引用 - 0

            常用鏈接

            隨筆分類

            隨筆檔案

            收藏夾

            Blogs

            c#(csharp)

            C++(cpp)

            Enlish

            Forums(bbs)

            My self

            Often go

            Useful Webs

            Xml/Uml/html

            搜索

            •  

            積分與排名

            • 積分 - 1804392
            • 排名 - 5

            最新評論

            閱讀排行榜

            久久男人Av资源网站无码软件 | 国产亚洲色婷婷久久99精品| 久久人妻AV中文字幕| 久久精品人妻中文系列| 91精品国产高清91久久久久久| 996久久国产精品线观看| 久久久久亚洲AV无码专区网站| 亚洲精品NV久久久久久久久久 | 久久亚洲AV成人无码国产| 精品久久久久久国产| 久久婷婷午色综合夜啪| 久久精品国产99国产精品澳门| 日本久久中文字幕| 久久久91精品国产一区二区三区| 国产毛片久久久久久国产毛片| 久久国语露脸国产精品电影| 久久精品国产精品青草| 日产精品久久久久久久| 伊人色综合久久天天| 亚洲精品国产美女久久久| 久久精品国产99久久丝袜| 国产69精品久久久久777| 伊人久久大香线蕉无码麻豆| 久久综合久久综合久久| 国内精品伊人久久久久777| 精品免费久久久久国产一区| 久久国产色AV免费观看| 亚洲综合日韩久久成人AV| 精品无码久久久久久久动漫| 久久久久久a亚洲欧洲aⅴ| 国产精品对白刺激久久久| 久久综合88熟人妻| 亚洲中文字幕久久精品无码APP| 久久91精品国产91| 国产欧美久久久精品影院| 久久亚洲天堂| 超级97碰碰碰碰久久久久最新| 午夜精品久久久内射近拍高清| 精品久久久久国产免费| 亚洲天堂久久精品| 精品国产青草久久久久福利|