C++ 技术中心

   :: 首页 :: 联系 ::  :: 管理
  160 Posts :: 0 Stories :: 87 Comments :: 0 Trackbacks

公告

郑重声明:本BLOG所发表的原创文章,作者保留一切权利。必须经过作者本人同意后方可转载,并注名作者(天空)和出处(CppBlog.com)。作者Email:coder@luckcoder.com

留言簿(27)

搜索

  •  

最新随笔

最新评论

评论排行榜

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


class CParent
{
public:
    CParent()
{}

    
//以下在构造函数是初始化成员列表,多个用逗号隔开
    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,不可以稳式转换
    
//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;
}


posted on 2011-03-08 14:54 C++技术中心 阅读(1672) 评论(2)  编辑 收藏 引用 所属分类: C++ 基础

Feedback

# re: 初始化成员列表以及四种强制类型转换使用 2011-03-08 17:07 Vincent
第二条不是虚表不起作用
是copy构造函数中,编译器把vtptr给换掉了,就像文中所说,tmpParent是CParent对象
  回复  更多评论
  

# re: 初始化成员列表以及四种强制类型转换使用 2011-03-09 08:44 C++技术中心
@Vincent
非常感谢您的关注与补充!  回复  更多评论
  


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理