虚函数 以及dynamic_cast static_cast

转载 2016年05月31日 18:50:08
1.class Base
{
public:Base(){}
public:
/* virtual*/    void print(){cout<<"Base";}
};


class Derived:public Base
{
public:Derived(){}
public:
    void print(){cout<<"Derived";}
};




int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
   


    Base *point=new Derived();

    point->print();



 // 比较不同to thi


2


dynamic_cast主要用于类层次间的上行转换和下行转换,还可以用于类之间的交叉转换。

在类层次间进行上行转换时,dynamic_cast和static_cast的效果是一样的;在进行下行转换时,dynamic_cast具有类型检查的功能,比static_cast更安全。

class Base
{
public:
    
int m_iNum;
    
virtual void foo();
};

class Derived:public Base
{
public:
    
char *m_szName[100];
};

void func(Base *pb)
{
    Derived 
*pd1 = static_cast<Derived *>(pb);

    Derived 
*pd2 = dynamic_cast<Derived *>(pb);
}

在上面的代码段中,
如果pb实际指向一个Derived类型的对象,pd1和pd2是一样的,并且对这两个指针执行Derived类型的任何操作都是安全的;
如果pb实际指向的是一个Base类型的对象,那么pd1将是一个指向该对象的指针,对它进行Derived类型的操作将是不安全的(如访问m_szName),而pd2将是一个空指针(即0,因为dynamic_cast失败)。
另外要注意:Base要有虚函数,否则会编译出错;static_cast则没有这个限制。这是由于运行时类型检查需要运行时类型信息,而这个信息存储在类的虚函数表(关于虚函数表的概念,详细可见<Inside c++ object model>)中,只有定义了虚函数的类才有虚函数表,没有定义虚函数的类是没有虚函数表的。

另外,dynamic_cast还支持交叉转换(cross cast)。如下代码所示。
class Base
{
public:
    
int m_iNum;
    
virtual void f(){}
};



class Derived1 : public Base
{

};

class Derived2 : public Base
{

};

void foo()
{
    derived1 
*pd1 = new Drived1;

    pd1
->m_iNum = 100;

    Derived2 
*pd2 = static_cast<Derived2 *>(pd1); //compile error

    Derived2 
*pd2 = dynamic_cast<Derived2 *>(pd1); //pd2 is NULL

    delete pd1;
}

在函数foo中,使用static_cast进行转换是不被允许的,将在编译时出错;而使用 dynamic_cast的转换则是允许的,结果是空指针。

static_cast与dynamic_cast的比较

最近一直在琢磨类型转换的问题,索性追究到底了。仍然是前面提到的继承结构:base1、base2、derived,但是base1和derived有同名的、非虚函数,我的目的是:使用子类的对象,调用基类的...
  • boluo1982107
  • boluo1982107
  • 2008年11月06日 17:55
  • 14368

C++中static_cast和dynamic_cast强制类型转换

前言 说起C++中的继承、多态、虚函数等概念,可能很多同学都有所了解,但是要说真正熟知的同学可能就不是很多了。最近在编程过程中了解到C++类型的层次转换(这就涉及到了多态和继承的相关概率),通常C语言...
  • qq_26849233
  • qq_26849233
  • 2017年03月15日 11:45
  • 4613

类型转换操作符:static_cast, dynamic_cast, const_cast, reinterpret_cast.

呵呵,今天来好好看看着几个转换操作符的用法。以前老是看着眼熟,但是用着手生。今天决定搞定这些个东西。在C语言中类型转换有几种方式:1.      (expression). 在表达式外边加括号,由编译...
  • callmeback
  • callmeback
  • 2009年04月01日 11:26
  • 4673

C++ static_cast和dynamic_cast的区别

网上也看到了一些相关的总结,总觉得他们总结的不太好,还是按照自己的理解写一写吧。 C语言类型转换:           C语言提供了隐式转换,显示转换。通过这两种方式,C语言中大部分的类型...
  • u010122607
  • u010122607
  • 2015年10月26日 11:32
  • 785

C++中static_cast/const_cast/dynamic_cast/reinterpret_cast的区别和使用

C++中static_cast/const_cast/dynamic_cast/reinterpret_cast的区别和使用
  • fengbingchun
  • fengbingchun
  • 2016年04月24日 20:36
  • 10393

虚函数对于dynamic_cast转换的作用

虚函数对于dynamic_cast转换的作用   为何使用dynamic_cast转换类指针时,需要虚函数呢。 Dynamic_cast转换是在运行时进行转换,运行时转换就需要知道类对象的信息(继...
  • jiaoyongqing134
  • jiaoyongqing134
  • 2016年08月31日 14:19
  • 846

C++中static_cast, dynamic_cast, const_cast用法/使用情况及区别解析

首先回顾一下C++类型转换: C++类型转换分为:隐式类型转换和显式类型转换 第1部分. 隐式类型转换 又称为“标准转换”,包括以下几种情况: 1) 算术转换(Arithmetic conv...
  • bzhxuexi
  • bzhxuexi
  • 2013年11月29日 11:17
  • 8623

为何使用dynamic_cast转换类指针时,需要虚函数?

虚函数对于dynamic_cast转换的作用   为何使用dynamic_cast转换类指针时,需要虚函数呢。 Dynamic_cast转换是在运行时进行转换,运行时转换就需要知道类对象的信息(继...
  • u010566813
  • u010566813
  • 2015年10月11日 23:50
  • 948

实例:父类指针操作子类对象,以及dynamic_cast和static_cast的比较

实例:父类指针操作子类对象,以及dynamic_cast和static_cast的比较
  • Jhoneson
  • Jhoneson
  • 2017年03月05日 10:16
  • 364

C语言拾遗:static_cast, dynamic_cast, reinterpret_cast, const_cast区别比较

转自:http://www.cnblogs.com/jerry19880126/archive/2012/08/14/2638192.html 隐式转换(implicit conve...
  • top_along
  • top_along
  • 2014年07月23日 17:48
  • 806
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:虚函数 以及dynamic_cast static_cast
举报原因:
原因补充:

(最多只允许输入30个字)