dynamic_cast为什么可以做“变性手术”?
#include <iostream>
using namespace std;
class People
{
public:
People()
{
cout << "People constructed" << endl;
}
virtual void speak() = 0;
};
class Man:public People
{
public:
void speak()
{
cout << "A man speaks" << endl;
}
void fight()
{
cout << "A man fights" << endl;
}
};
class Woman:public People
{
private:
Man son;
public:
void speak()
{
cout << "A woman speaks" << endl;
}
void cook()
{
cout << "A woman cooks" << endl;
}
Man getSon()
{
cout << "A woman's son:" << endl;
return son;
}
};
///////////////////////////SubMain//////////////////////////////////
int main(int argc, char *argv[])
{
People *p = new Man();
p->speak();
Man *m = dynamic_cast<Man *>(p);
m->fight();
Man *m2 = (Man *)p;
m2->fight();
try
{
Woman *w = dynamic_cast<Woman *>(p);
// if (w != NULL)
// {
// w->cook();
// w->getSon().speak();
// }
// 如果不检查直接用的话,居然也可以
w->cook();
w->getSon().speak();
}
catch(bad_cast &e)
{
cout << "bad_cast exception" << endl;
}
delete p;
system("pause");
return 0;
}
///////////////////////////End Sub//////////////////////////////////
/************************************************************************/
/* output:
People constructed
A man speaks
A man fights
A man fights
A woman cooks
A woman's son:
A man speaks
*/
/************************************************************************/
我故意不检查转换是否成功,按照道理来讲w->cook();就应该报运行时错误吧?
相关推荐
static_cast,dynamic_cast,reinterpret_cast,const_cast的区别及用法详解
1.static_cast对类的指针只能转换有继承关系的类。对普通的指针来说只能在void*和其他指针之间转换。它还可转换简单的类型,比如int到char等。不能提供数字到指针的转换。不能提供不同类型指针之间的转换比如int*到char*。 2.dynamic_cast提供安全的转换如果两个指针不存在继承关系转换会失败返回空指针,如果你提供一个错误的指针那样会发生内存访问异常,因为它会去比较两个类型的虚函数表。虚函数表的指针一般放在对象指针最开始的四字节中,你去访问一个错误的地址这样肯定会发生异常。 3.reinterpret_cast提供数字到指针间的转换比如void*到int。提供不同类型
static_cast,dynamic_cast,reinterpret_cast和const_cast的区别详解
C-style cast举例: int i; double d; i = (int) d;上面的代码就是本来为double类型的d,通过(int)d将其转换成整形值,并将该值赋给整形变量i (注意d本身的值并没有发生改变)。这就是典型的c-style类型转换。下面是一个简单的程序: 代码如下:#include using namespace std;int main(void){ int i; double d = 11.29; i = (int)d; cout << i << endl; co
static_cast、dynamic_cast、reinterpret_cast和const_cast
标准C++的类型转换符:static_cast、dynamic_cast、reinterpret_cast和const_cast
C++中的类型转换static_cast、dynamic_cast、const_cast和reinterpret_cast总结
主要介绍了C++中的类型转换static_cast、dynamic_cast、const_cast和reinterpret_cast总结,需要的朋友可以参考下
C++ 中dynamic_cast的用法
/*这是从网上摘下的样例,主要讲述了 dynamic_cast<> 的用法。*/ /* 作用:将一个基类对象指针(或引用)cast到继承类指针,dynamic_cast会依据基类指针是否真正指向继承类指针来做对应处理, 即会作一定的推断。 对指针进行dynamic_cast,失败返回null,成功返回正常cast后的对象指针; 对引用进行dynamic_cast,失败抛出一个异常,成功返回正常cast后的对象引用。 注意:dynamic_cast在将父类cast到子类时,父类必需要有虚函数。比如在以下的代码中将CBasic类中的test函数不定义成 virtual时,编译器会报错


