虚函数 以及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的转换则是允许的,结果是空指针。

Java静态泛型方法

Java在JDK 5中引入了泛型,使用起来方便了很多,下面是一段很常见的泛型使用: ListString> list = new ArrayListString>(); 泛型方法使用 不仅集合中...

运算符重载/虚函数/dynamic_cast类型转换

1.基本的运算符重载 #include using namespace std; class Point{ int _x, _y; public: Point(int x = 0, int y ...

dynamic_cast与typeit及虚函数知识点

/* 带虚函数与不带虚函数转换的区别。 dynamic_cast:必须要有虚函数才可以转换。 dynamic_cast:只能处理转换指针或引用,不能转换对象。 dynamic_case 只能识别多态...

C++中的四种强制转换 dynamic_case,const_cast,static_case,reinterprer_case的不同

使用标准C++的类型转换符:static_cast、dynamic_cast、reinterpret_cast、和const_cast。 1 static_cast 用法:static_cas...
  • Andeewu
  • Andeewu
  • 2012年10月18日 17:58
  • 843

Dynamic/Static/Reinterpret/Const and Volatile Cast (English)

Const and Volatile Cast The expression const_cast(v) can be used to change the "const" or "volati...
  • Qsir
  • Qsir
  • 2017年07月05日 10:28
  • 142

浅议 Dynamic_cast 和 RTTI与虚函数表的关系

浅议 Dynamic_cast 和 RTTI 写这篇博文的目的是,记录学习过程。 对于问题要较真,在解决这个问题中会学到很多,远远超过自己期望,锻炼思维,享受这个过程。 问题: Static...

opencv实现多图像读取并显示,sprintf_s函数,static_cast

基于opencv和C++实现多幅图像的加载,程序中需要将文件统一命名,而且文件名最后一定是数字,还未实现对字符文件名图像的加载。 首先介绍一个函数sprintf_s,sprintf_s是sprint...

由static_cast和dynamic_cast到C++对象占用内存的分析

static_cast和dynamic_cast是C++的类型转换操作符。编译器隐式执行的任何类型转换都可以由static_cast显式完成,即父类和子类之间也可以利用static_cast进行转换。...

static_cast 和 dynamic_cast的区别

用法:static_cast ( expression ) 该运算符把expression转换为type-id类型,但没有运行时类型检查来保证转换的安全性。它主要有如下几种用法:   ①用于类...

static_cast and dynamic_cast

原文: www.cnblogs.com/bastard/archive/2011/12/14/2288117.html 一 C语言中存在着两种类型转换: 隐式转换和显式转换 隐式转换:不同...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:虚函数 以及dynamic_cast static_cast
举报原因:
原因补充:

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