dynamic_cast的妙用
2010-03-12 19:17
281 查看
class base
{
public:
void iAm(){cout<<"base\n";}
virtual ~base(){}
};
class derived: public base
{
public:
void iAm(){cout<<"derived\n";}
virtual ~derived(){}
};
void testclass(base *p)
{
//在这里想办法输出实际类名
//p有可能是base类型指针传进来也有可能是derived类型指针传进来
}
测试用例如下:
base b;
derived d;
testclass(&b);
testclass(&d);
则输出为:
base
derived
——来自2Kgames实习生笔试题
这题,其实就是给定一个父类和子类,并创建一个指向类的指针,然后该指针已经被强制转换成了指向父类的指针,然后想让你用某种方法判断出该指针所指向的对象其实是个真正的父类对象,还是一个被强制当做父类的子类对象!
用dynamic_cast强制类型转换就能做到这一点,以下是解决方案:
代码解决方案#include <iostream>
using namespace std;
class base
{
public:
void iAm(){cout<<"base\n";}
virtual ~base(){}
};
class derived: public base
{
public:
void iAm(){cout<<"derived\n";}
virtual ~derived(){}
};
void testclass(base *p)
{
//在这里想办法输出实际类名
//p有可能是base类型指针传进来也有可能是derived类型指针传进来
if( derived * temp = dynamic_cast<derived *>( p ) )
{
temp->iAm();
}
else
{
p->iAm();
}
}
int main(int argc, char* argv[])
{
base b;
derived d;
testclass(&b);
testclass(&d);
return 0;
}
运行在VS2008上显示输出结果为:
base
derived
^_^ 成!
{
public:
void iAm(){cout<<"base\n";}
virtual ~base(){}
};
class derived: public base
{
public:
void iAm(){cout<<"derived\n";}
virtual ~derived(){}
};
void testclass(base *p)
{
//在这里想办法输出实际类名
//p有可能是base类型指针传进来也有可能是derived类型指针传进来
}
测试用例如下:
base b;
derived d;
testclass(&b);
testclass(&d);
则输出为:
base
derived
——来自2Kgames实习生笔试题
这题,其实就是给定一个父类和子类,并创建一个指向类的指针,然后该指针已经被强制转换成了指向父类的指针,然后想让你用某种方法判断出该指针所指向的对象其实是个真正的父类对象,还是一个被强制当做父类的子类对象!
用dynamic_cast强制类型转换就能做到这一点,以下是解决方案:
代码解决方案#include <iostream>
using namespace std;
class base
{
public:
void iAm(){cout<<"base\n";}
virtual ~base(){}
};
class derived: public base
{
public:
void iAm(){cout<<"derived\n";}
virtual ~derived(){}
};
void testclass(base *p)
{
//在这里想办法输出实际类名
//p有可能是base类型指针传进来也有可能是derived类型指针传进来
if( derived * temp = dynamic_cast<derived *>( p ) )
{
temp->iAm();
}
else
{
p->iAm();
}
}
int main(int argc, char* argv[])
{
base b;
derived d;
testclass(&b);
testclass(&d);
return 0;
}
运行在VS2008上显示输出结果为:
base
derived
^_^ 成!
相关文章推荐
- 转:C++关键字详解(volatile, mutable, explicit, dynamic_ cast<T>(expression))等
- C++中的类型转换(static_cast、const_cast、dynamic_cast、reinterpret_cast)
- C++标准转换运算符dynamic_cast
- dynamic_cast
- 【C/C++学习】之五、dynamic_cast
- dynamic_cast介绍
- static_cast、dynamic_cast reinterpret_cast和const_(
- 浅议 Dynamic_cast 和 RTTI
- C++的类型转换符:static_cast、dynamic_cast、reinterpret_cast和const_cast
- static_cast、dynamic_cast、const_cast和reinterpret_cast总结
- 标准C++的类型转换符:static_cast、dynamic_cast、reinterpret_cast和const_cast
- C++的类型转换:static_cast、dynamic_cast、reinterpret_cast和const_cast(dynamic_cast还支持交叉转换,const_cast将一个类的const、volatile以及__unaligned属性去掉)
- static_cast、dynamic_cast、reinterpret_cast、和const_cast(转)
- C++类型转换符reinterpret_cast,static_cast,dynamic_cast,const_cast
- 总结 C++中的所有强制转换函数 (const_cast,reinterpret_cast,static_cast,dynamic_cast)
- static_cast、dynamic_cast、reinterpret_cast、和const_cast
- dynamic_cast用法
- 标准C++的类型转换符:static_cast、dynamic_cast、reinterpret_cast和const_cast(转载)
- dynamic_cast
- c++强制类型转换:dynamic_cast、const_cast 、static_cast、reinterpret_cast