亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? ex22.cpp

?? c++代碼,來源于網上.c++代碼,來源于網上c++代碼,來源于網上.
?? CPP
字號:
	     
          //第22章 多重繼承和類型變換

//[例22.1]多個直接基類
    #include<stdio.h>
	struct CBase1
	{	CBase1(int n=1){m_b1=n;printf("CBase1::CBase1()this=%p,%p\n",this,&m_b1);}
		void  Show() 
         {printf("%d.CBase1::Show() sizeof(CBase1)=%d\n",m_b1,sizeof(CBase1));}
		int m_b1; 
	};
	class CBase2  
	{	public:	CBase2(int n=2)
              {m_b2=n;printf("CBase2::CBase2()this=%p,%p\n",this,&m_b2);}
		void  Show()
        {printf("%d.CBase2::Show() sizeof(CBase2)=%d\n",m_b2,sizeof(CBase2));}
		long l;    
	    protected:  int m_b2;
	};
	class CDerived:public CBase2, virtual public CBase1
	{	public:CDerived(int n=3)
			{m_d=n;printf("CDerive::CDeriv this=%p,%p\n",this,&m_d);}
		int m_d;	 		
	    int Show();	 
	};
	int CDerived::Show()
	{	CBase1::Show();        CBase2::Show();
		printf("%d.CDerived::Show() sizeof(CDerived)=%d\n",m_d,sizeof(CDerived));	
		return 0;
	}
     void main()	     {	 CDerived d; 		 d.Show();		 }
//[例22.2]關鍵字virtual對多重繼承的影響。從輸出結果注意構造函數調用的次序。 
     #include<stdio.h>
    class CTop
	{   public:	int mt;
        CTop(int n=0)	 {mt=n;printf("%d.CTop()this=%p,%p\n",mt,this,&mt);}
	};
	struct CBase1:virtual public CTop
	{	CBase1(int n=1)	{b1=n;printf("CBase1()this=%p,%p\n",this,&b1);}
		void  Show() 
		{printf("%d.CBase1::Show()sizeof(CBase1)=%d\n",b1,sizeof(CBase1));}
		int b1; 
	};
	class CBase2: public virtual 	CTop 
	{	public:	CBase2 (int n=2){b2=n;printf("CBase2()this=%p,%p\n",this,&b2);}
		void  Show()
		{printf("%d.CBase2::Show()sizeof(CBase2)=%d\n",b2,sizeof(CBase2));}
		long l;    	    protected:  int b2;
	};
	class ClassD:public CBase1,public CBase2
	{	public:	 int d;	 	
		ClassD(int n=3){d=n;printf("ClassD()this=%p,%p\n",this,&d);}
	    int Show();	 
	};
	int ClassD::Show()
	{	CBase1::Show();		CBase2::Show();
		printf("%d.ClassD::Show()sizeof(ClassD)=%d\n",d,sizeof(ClassD));	
		return 0;
	}
     void main()	 {	 ClassD d;	d.Show();	}
//[例22.3]非虛擬繼承兩個基類同時包含兩個嵌入對象的派生類
    #include <stdio.h> //先調用基類的構造函數然后調用派生類嵌入對象的構造函數。
	struct A	{  A(int n=1){printf("A=%d,",n);}}; //首先根據聲明的次序分別調用
    struct B	{  B(int n=2){printf("B=%d,",n);}}; //基類A,B的構造函數
   	struct D:public A,public B                  //基類構造函數的次序為A,B
	{    D(int n,int m): A(n),b(m)             //構造函數定義, 僅顯式調用A(n),b(m)
		  {printf("D=%d\n",n+m);}//包容類D的構造函數后于嵌入對象的構造函數被調用
	     B b;   A a;                       //聲明兩個嵌入結構變量,次序為b,a
    };                                     //嵌入對象構造函數的調用次序為B,A
    void main(){ D d(100,200);}                //輸出:A=100,B=2,B=200,A=1,D=300
   //[例22.4]多繼承間接基類的初始化
    #include<stdio.h>
    class CTop	                                      //虛擬繼承的樹層次//
	{   public: int m_t;
		CTop(int n=0)
		{ m_t=n; printf("%d.CTop=%d,",m_t,sizeof(CTop));}
	};
	struct CBase1:virtual public CTop
	{   int m_b1;
		CBase1(int n=1):CTop(n)                            
		{ m_b1=n;printf("%d.CBase1=%d,",m_b1,sizeof(CBase1));}
	};	class CBase2: public virtual CTop 	{  public:	CBase2 (int n=2):CTop(n)		{  m_b2=n; printf("%d.CBase2=%d,",m_b2,sizeof(CBase2));}		protected:  int m_b2;	};	class CDerived:public CBase1,public CBase2	{  public:	                                     	
        CDerived(int n):CBase2(n-3),CBase1(n-2),CTop(n-1)//構造函數初始化
		{m_d=n;	printf("%d.CDerived=%d\n",m_d,sizeof(CDerived));}
	   int m_d;	 		  
	};
    void main()	 {CDerived   d(4)	; 	}
CDerived(int n):CBase2(n-3),CBase1(n-2)
		{m_d=n;	printf("%d.CDerived=%d\n",m_d,sizeof(CDerived));}
//[例22.5]不唯一的名稱m_n,Set,f()可產生二義性。
	#include<stdio.h>
     class A    {    public:  void f(){}	    };	      class B:public  A{ public : void f(){}
	    public : int m_n;	      void Set(int n){ m_n=n;	} };
    struct C	{  int m_n; 		  void Set(int n){m_n=n;	} };
	class D:public C,public B
	{  public:	 int m_d;		   void Set(int n){m_d=n;}  };
    //[例22.6]清除名稱二義性的途徑
   class CTop		           { public:	int m_t; };
   struct CBase1:	public CTop	{int m_b1;};
   class CBase2:  public  CTop {protected:  int m_b2;	};
	class CDerived:public CBase1,public Cbase2
	{		public:    int m_d;	 		  	};

//[例22.7]動態類型變換
	#include <stdio.h>  
	class ClassB 
	{ public:	 long  m_n;
	  public:	ClassB() {m_n=1;}
				virtual		f(){}              //設置一個虛函數是必要的
		void Show(){printf("ClassB::m_n=%d\t",m_n);}	//此時Show不是虛函數
    };   
	class ClassC:public ClassB 
	{   	public:	ClassC() {m_n=2;}	
	    void Show(){printf("ClassC::m_n=%d\t",m_n);}		 
   	};  
    class ClassD:public ClassC
	{	 public:ClassD() {m_n=3;}	
	    void Show(){printf("ClassD::m_n=%d\t",m_n);}	
	};	
	void fcast(ClassB* pObj)
	{	ClassC* pObjc=dynamic_cast<ClassC*>(pObj) ;
    	if(pObjc!=NULL) pObjc->Show();
	}
	void main()
	{	ClassB objb;         fcast(&objb);
        ClassB *pObjb=new 	ClassD();//pObjb具有動態類型為ClassD*
	    fcast(pObjb);
		((ClassD*)pObjb)->Show();     //將pObjb真正變換到原來的對象地址
        ClassC objc;  	    fcast(&objc);
	}		//輸出:ClassC::m_n=3   ClassD::m_n=3       ClassC::m_n=2
//[例22.8]引用形式的動態類型變換
	#include <stdio.h>  
    #include<typeinfo.h>
	class ClassB 
	{	 public:	 long  m_n;
	    public:	ClassB() {m_n=1;}
	virtual	void Show(){printf("ClassB::m_n=%d\n",m_n);}	//該題Show是虛函數
    };   
	class ClassC:public ClassB 
	{   	public:	ClassC() {m_n=2;}	
	    void Show(){printf("ClassC::m_n=%d\n",m_n);}		 
   	};  	
    class ClassD:public ClassC
	{	 public:ClassD() {m_n=3;}	
	    void Show(){printf("ClassD::m_n=%d\n",m_n);}
		~ClassD() {printf("~ClassD;\n");}	
	};	
	void fcast(ClassB& rObj)
	{     try{
	      ClassC& rObjc=dynamic_cast<ClassC&>(rObj) ;
	      rObjc.Show();
	     }
	   catch(bad_cast)	   {	   printf("bad_cast produced\n");	   }
	}
	void main()
	{	ClassB objb;   fcast(objb);           //程序輸出結果:
        ClassB* pObjb=new 	ClassD();      //bad_cast produced
	    fcast(*pObjb); //動態綁定發生作用      // ClassD::m_n=3
		((ClassD&)*pObjb).Show();           //ClassD::m_n=3
        ClassC objc;                        // ClassC::m_n=2
	    fcast(objc);                          // ~ClassD;
        delete (ClassD*)pObjb;
	}
//[例22.9]繼承層次的靜態類型變換
	#include <stdio.h>  
	class ClassB 
	{	 public:	 long  m_n;
	    public:	ClassB() {m_n=1;}
	//virtual		                      // 去掉雙斜杠Show()為虛函數
		void Show(){printf("ClassB::m_n=%d\n",m_n);}	
    };   
	class ClassC:public ClassB 
	{   	public:	ClassC() {m_n=2;}	
	    void Show(){printf("ClassC::m_n=%d\n",m_n);}		 
   	};  
    class ClassD:public ClassC
	{	 public:ClassD() {m_n=3;}	
	    void Show(){printf("ClassD::m_n=%d\n",m_n);}
		~ClassD() {printf("~ClassD;\n");}	
	};	
	void fcastb(ClassB& rObj,int n)
	{	if(n==1)	{   ClassC& rObjc=static_cast<ClassC&>(rObj) ;//引用變換語法
			          rObjc.Show();				}
		else	   {   ClassC& rObjc=(ClassC&)(rObj) ;        //C形式的變換格式
		             rObjc.Show();	          } 
	}                                      //上面if分支兩種變換格式效果是等價的
	void fcasta(ClassB* pObj,int n)            //下面if分支兩種變換格式效果是等價的
	{   ClassC* pObjc;
		if(n==1) pObjc=static_cast<ClassC*>(pObj) ;		    //指針變換語法
		else     pObjc=(ClassC*)(pObj) ;		            //C形式的轉換格式
		pObjc->Show();	
	}
	void fa()                              //顯示指針類型靜態變換
	{	ClassB objb;                         fcasta(&objb,1);
        ClassB* pObjb=new 	ClassD();	    fcasta(pObjb,1);
        ClassC objc;   	                     fcasta(&objc,1);      
	    delete (ClassD*)pObjb;
	}
    void fb()                                //顯示引用形式靜態類型變換    
	{ 	ClassB objb;                         fcastb(objb,1);
        ClassB* pObjb=new 	ClassD();	    fcastb(*pObjb,2);
        ClassC objc;  	                      fcastb(objc,1);      		
	}
	void main(){      fa();       fb();           }
//[例22.10]簡單變量的靜態類型變換
    #include <stdio.h>
    void f(short  v)  { printf("%d\t",v);}   
	void f(float  f)  { printf("%f\n",f);}     
    void main()       
    {    long l=10;    double d=20;
        f( static_cast<short>(l)); 
	    f( static_cast< float >(d));
	}        //程序輸出結果:10   20.000000
//[例22.11]簡單變量的指針和引用變換
    #include <stdio.h>
    void f(short&   v)  { printf("%d\t",v);}   
	void f(double*  p)  { printf("%f\t",*p);}  
	void main()       
    {    long l=10;    float tf=20.0f;
        f(reinterpret_cast<short&>(l)); 
	    f(reinterpret_cast<double*>(&tf));
	    f((short&)l);    printf("*((double*)&tf)=%f\t",*((double*)&tf));
	    f((double*)(&tf));	
	}//////////////程序運行輸出結果://///////////////////
//[例22.12]松動實參const屬性的變換
    #include <stdio.h>   
	void fc(int*  p)  { printf("%d\t",*p);}//函數中沒有改變間接變量的值
	void fc(int&  v)  { printf("%d\n",v);} // 函數中v作為右值出現
	void main()           //d具有const int型的類型屬性
    {   const int d=20;// &d的地址具有const int *型的類型屬性
	    fc( const_cast<int*>(&d));	//效果上等價于fc( (int*)&d);
		fc( const_cast<int&>(d));  	//效果上等價于fc( (int&)d);	
	}         //輸出結果:20  20
//[例22.13]typeid顯示表達式的類型信息	
    #include <stdio.h>  
    #include<typeinfo.h>
	class ClassB                            //多態類之根基類
	{	public:	virtual void SetB(){m_b=1;}		
		int m_b;
	};
	class ClassC : public ClassB             //多態類繼承體系之派生類
	{	public:	void SetB(){m_c=2;}	int m_c;   	};	
	void main()
	{  double d;     
        if(typeid(int) !=typeid(double*))
		   if(typeid(&d) ==typeid(double*))  printf("%s\t", typeid(double*).name());     
		if(typeid('1')==typeid(char))         printf("%s\t", typeid('1').name());
		long n;      	
		float& rn=(float&)n;                 //內置數據變量不進行動態類型跟蹤
			printf("%s,\t%s\t", typeid(n).name(),typeid(rn).name());
		ClassB b;  	ClassC c;
		ClassB& rb=c;                  //引用rb的動態類型為 class  ClassC
			printf("%s,\t%s\t", typeid(b).name(),typeid(rb).name());
	}//輸出:double*    char    long,   float    class  ClassB, class  ClassC
//[例22.14]before和raw_name()成員函數
    #include <stdio.h>  
    #include<typeinfo.h>
    #include<string.h>
	class ClassB 
	{	public:		virtual void SetB(){m_b=1;}		
		int m_b;
	};
	class ClassC : public ClassB
	{	public:	int m_c;  
		    void SetB(){m_c=2;}	  
	};	
    void f1(int,float){}
	void f2(ClassC*,long){}
	void main()
	{	double d=1;  
	   const type_info& t1=typeid(f1);    const type_info& t2=typeid(f2);
	printf("%s,\t%s\n", t1.name(),t1.raw_name());    
	printf("%s,\t%s\n", t2.name(),t2.raw_name()); 
	ClassC c;	ClassB& rb=c;
	const type_info& tc=typeid(ClassC*);   // typeid(e)是const對象,別名也是const屬性
	const type_info& tb=typeid(rb);          //聲明typeid(rb)的別名tb簡化代碼書寫量
    if(t1.before(t2))
              printf("1--t1.before(t2)\t");
	if(strcmp(t1.raw_name(),t2.raw_name())<0) 
              printf("2--t1.before(t2)\n");
    if(tb.before(tc)) 
             printf("3--%s,\t%s\t", tb.name(),tc.name()); 
	 if(strcmp(tb.raw_name(),tc.raw_name())<0) 
           printf("4--%s,\t%s\n", tb.name(),tc.name()); 
	 void* vp=&d; 
   	 printf("%s,\t%s\n", typeid(vp).name(),typeid(*(double*)vp).name()); 
	}///////////////輸出結果://///////////////////



?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美一区二区福利视频| 欧美精品1区2区3区| 久久国产夜色精品鲁鲁99| 亚洲国产精品久久人人爱蜜臀| 国产三级精品视频| 久久亚洲欧美国产精品乐播| 日韩一卡二卡三卡国产欧美| 3d动漫精品啪啪一区二区竹菊| 日本高清免费不卡视频| 精品视频在线免费| 日韩视频一区二区| 久久综合国产精品| 国产精品乱码一区二区三区软件| 国产精品久久久久四虎| 亚洲精品中文在线| 日韩二区在线观看| 国产在线精品免费| av一区二区三区| 欧美色视频在线观看| 91精品欧美一区二区三区综合在| 日韩欧美国产系列| 中文字幕 久热精品 视频在线| 中文字幕综合网| 亚洲bt欧美bt精品| 国产成人综合在线观看| 92精品国产成人观看免费| 欧美视频你懂的| 精品国产91久久久久久久妲己 | 亚洲va欧美va人人爽| 蜜桃视频第一区免费观看| 国产成人精品影视| 欧美日韩一区二区三区四区 | 2023国产一二三区日本精品2022| 中文字幕欧美日本乱码一线二线| 亚洲免费电影在线| 久久国产精品色婷婷| 国产·精品毛片| 欧美日韩视频专区在线播放| 日韩精品一区在线观看| 日韩美女啊v在线免费观看| 日韩av不卡在线观看| jizzjizzjizz欧美| 精品日韩欧美在线| 亚洲一区二区在线播放相泽| 久久精品国产99| 在线看日本不卡| 国产片一区二区三区| 天天操天天干天天综合网| 99精品一区二区| 久久久久久久精| 日韩激情一二三区| 91色视频在线| 日本一区二区动态图| 精品一区二区三区免费| 欧美日韩中文字幕一区| 亚洲欧美综合色| 韩国毛片一区二区三区| 欧美一区二区大片| 午夜伦理一区二区| 91福利国产精品| 国产精品美女一区二区三区| 久久99这里只有精品| 欧美亚男人的天堂| 亚洲一区二区在线免费看| 成av人片一区二区| 国产精品萝li| av成人免费在线观看| 国产精品素人视频| 豆国产96在线|亚洲| 久久免费电影网| 国产专区欧美精品| 久久青草国产手机看片福利盒子 | 久久精品亚洲麻豆av一区二区 | 中文字幕不卡在线播放| 国产精品一二一区| 亚洲精品一区二区三区在线观看| 日韩高清在线电影| 日韩午夜激情视频| 国产自产v一区二区三区c| 欧美tickling挠脚心丨vk| 激情图片小说一区| 久久精品一区蜜桃臀影院| 国产成人亚洲综合a∨猫咪| 亚洲国产精品ⅴa在线观看| 国产成人av电影免费在线观看| 日本一区二区三区免费乱视频| 国产乱码精品一区二区三| 国产精品久久毛片av大全日韩| 波多野结衣在线一区| 亚洲女人的天堂| 欧美群妇大交群中文字幕| 日韩—二三区免费观看av| 欧美精品一区二区在线播放| 国产精品亚洲视频| 中文字幕字幕中文在线中不卡视频| 色中色一区二区| 日韩国产欧美三级| 久久综合九色综合欧美亚洲| thepron国产精品| 亚洲www啪成人一区二区麻豆| 日韩精品一区二区三区视频播放 | 精品国产成人在线影院 | 337p亚洲精品色噜噜狠狠| 奇米影视一区二区三区小说| 久久综合一区二区| 99精品桃花视频在线观看| 一区二区免费看| 日韩免费视频线观看| 不卡一区在线观看| 爽好多水快深点欧美视频| 久久久久一区二区三区四区| 色8久久精品久久久久久蜜| 玖玖九九国产精品| 亚洲日本中文字幕区| 日韩欧美久久久| 99久久夜色精品国产网站| 青青青爽久久午夜综合久久午夜| 久久精品人人爽人人爽| 欧美综合色免费| 国产自产视频一区二区三区| 亚洲久草在线视频| 国产欧美一区二区精品忘忧草| 精品视频1区2区3区| 成人av在线影院| 麻豆freexxxx性91精品| 亚洲精品欧美综合四区| 久久日韩粉嫩一区二区三区| 欧美日韩一区二区三区免费看| 国产精品综合av一区二区国产馆| 亚洲国产三级在线| 中文字幕在线不卡视频| 久久午夜国产精品| 7777精品伊人久久久大香线蕉完整版| 成人av网址在线| 国产精品1区2区3区| 久久成人久久爱| 午夜精品久久久久久久久| 亚洲精品自拍动漫在线| 国产精品福利电影一区二区三区四区| 欧美成人性福生活免费看| 欧美午夜精品免费| 色88888久久久久久影院按摩| 国产69精品久久久久毛片| 国产精品自拍毛片| 国产在线乱码一区二区三区| 日韩精品欧美成人高清一区二区| 亚洲人成精品久久久久久| 欧美激情在线一区二区| 26uuu国产在线精品一区二区| 欧美蜜桃一区二区三区| 色视频欧美一区二区三区| 99久久久久久99| 成人高清视频在线观看| av亚洲精华国产精华精华| 成人av网站在线观看| caoporn国产一区二区| 不卡视频一二三| 波多野结衣中文字幕一区二区三区| 国产成人综合精品三级| 国产91精品久久久久久久网曝门| 激情另类小说区图片区视频区| 蜜臀av性久久久久蜜臀aⅴ流畅| 婷婷久久综合九色综合绿巨人 | 91在线视频播放地址| 色综合色综合色综合色综合色综合 | 94-欧美-setu| 91免费看片在线观看| 欧美亚洲国产一区二区三区va| 欧美三级视频在线观看| 91麻豆精品国产自产在线观看一区| 欧美一激情一区二区三区| 久久亚洲春色中文字幕久久久| 久久精品日韩一区二区三区| 国产精品欧美久久久久无广告| 亚洲视频免费观看| 亚洲超碰精品一区二区| 精品一区二区三区久久| 成人高清免费观看| 欧美无乱码久久久免费午夜一区| 欧美久久免费观看| 久久久激情视频| 亚洲免费av高清| 男女性色大片免费观看一区二区| 久久99国产精品麻豆| 成人免费高清视频在线观看| 欧美网站一区二区| 久久欧美中文字幕| 亚洲一区二区在线播放相泽| 久久国产精品无码网站| 色噜噜久久综合| 久久日韩精品一区二区五区| 亚洲视频一二三区| 精品一区二区精品| 日本韩国欧美一区| 国产视频在线观看一区二区三区| 亚洲专区一二三| 国产成人午夜99999| 制服丝袜中文字幕一区| 亚洲欧美色一区| 国内精品写真在线观看|