#include "stdafx.h"
#include <conio.h>
#include <iostream>
#include <string>
using namespace std;
using namespace std;


class CParent
  {
public:
 CParent() {}

//以下在構造函數(shù)是初始化成員列表,多個用逗號隔開
 CParent(string strName,int age):strName(strName),m_age(age) {}
 virtual string GetName() {return strName;}
private:
string strName;
int m_age;
};


class CChild:public CParent
  {
public:
//初始化成員列表父類與本類的成員
//加入explicit關鍵字,防止隱式類型轉換
 explicit CChild(string strName):CParent("Parent:"+strName,34),strName("Child:"+strName) {}
 string GetName() {return strName;}
private:
string strName;
};


int _tmain(int argc, _TCHAR* argv[])
  {
int pause;

//調用父類構造
CParent parent("parent",56);
cout<<parent.GetName()<<endl;

//調用子類構造
CChild child("sky");
cout<<child.GetName()<<endl;

//子類構造有加explicit,不可以穩(wěn)式轉換
//CChild child1 = "explicitTest";
//cout<<child1.GetName()<<endl;

//1.static_cast類型轉換
//a.指針轉換
CParent *pParent=NULL;
pParent = static_cast<CParent*>(&child) ;
cout<<pParent->GetName()<<endl;//調用的是CChild類的GetName

//b.對象間轉換
CParent tmpParent;
//tmpParent = (CParent)child;
tmpParent = static_cast<CParent>(child) ;
cout<<tmpParent.GetName()<<endl;//調用的是父類GetName,因為tmpParent是Cparent對象
//虛表不起作用

//2.dynamic_cast類型轉換
CChild *pChild1;
CChild *pChild2;
pChild1 = dynamic_cast<CChild*>(&parent);//將返回空指針
pChild2 = static_cast<CChild*>(&parent); //返回的是parent地址.但調用子類的方法,將不安全
 /**//*dynamic_cast支持交叉轉換
如果B繼承A,C也繼承A.
那么將B用static_cast轉成C是編譯錯誤
將B用dynamic_cast轉成C返回NULL指針
*/


//3.const_cast
const CParent *constParent=NULL;
CParent *pParent1 = const_cast<CParent*>(constParent);

//4.reinterpret_cast
//最底層的重新解釋
//reinterpret_cast原原本本的位復制,而static_cast有內部解析轉換
int n=9;
double d1=reinterpret_cast<double & > (n);
cout<<d1<<endl;

double d2 = static_cast<double>(n);
cout<<d2<<endl;

_getch();
return 0;
}


|