C风格强制转换 和 static_cast的差别

galmang2012 2012-04-19 11:01:53
class CPerson
{
public:
void Show()
{
std::cout<<"CPerson()!"<<std::endl;
}
};
class CStudent : private CPerson
{
};

int _tmain(int argc, _TCHAR* argv[])
{
CStudent* stu1 = new CStudent();

//stu1->Show(); //1. 编译不通过 可以理解

//CPerson* per2 = static_cast<CPerson*>(stu1); //2. 编译不通过 无法理解
//per2->Show();

CPerson* ppson = (CPerson*)stu1; // 3. 编译通过
ppson->Show();

return 0;
}

学生认为在这样的情况下2和3是会发生一样的转换,但事实却不是

学生学习当中请高手解释下情况2 和情况3 转换流程,学生不胜感激!

...全文
338 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
Kaile 2012-04-19
  • 打赏
  • 举报
回复
dynamic_cast一般是父类的指针转换为子类的指针,而子类的指针不用转换直接就可以给父类的指针赋值
  • 打赏
  • 举报
回复
dynamic_cast一般是父类的指针转换为子类的指针,而子类的指针不用转换直接就可以给父类的指针赋值,

其实这一句CPerson* per2 = static_cast<CPerson*>(stu1); 没必要进行转换,直接就可以赋值,
CPerson* per2 = stu1;这样就可以,

比如这样就必须进行强制转换:
CPerson *pc = new CPerson;
CStudent *ps = dynamic_cast<CStudent *>(pc);

  • 打赏
  • 举报
回复
因为你的继承是私有的,不能访问基类,换成公有继承就可以用static_cast来进行转换了,一般转换有继承关系的类,应该用dynamic_cast来进行基类与子类之间的转换,

C++风格的转换分的层次比较清楚一些,各有各的职责,比如:const_cast只能用来转换掉对象的const特性,不能用来干别的事情,最好看看这4个转换的区别:
static_cast;
const_cast;
dynamic_cast;
reinterpret_cast;

C风格的转换比较霸道一些,不管三七二十一就转换,有什么分不清是从什么到什么的转换,C++的转换条理比较清楚。
evencoming 2012-04-19
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]
static_cast保证了非 类型的向下转换以外的 转换的安全性转换。
类型向下转换应该要 dynamic_cast,即
CPerson* per2 = static_cast<CPerson*>(stu1);
==>
CPerson* per2 = dynamic_cast<CPerson*>(stu1);
[/Quote]
搞错了,dynamic_cast得有虚函数才行。
  • 打赏
  • 举报
回复
static_cast会检查合法性
C强转不会
evencoming 2012-04-19
  • 打赏
  • 举报
回复
static_cast保证了非 类型的向下转换以外的 转换的安全性转换。
类型向下转换应该要 dynamic_cast,即
CPerson* per2 = static_cast<CPerson*>(stu1);
==>
CPerson* per2 = dynamic_cast<CPerson*>(stu1);
galmang2012 2012-04-19
  • 打赏
  • 举报
回复
可以说的 再具体些吗?
redleaves 2012-04-19
  • 打赏
  • 举报
回复
私有继承导致static_cast转型失败.外部无法访问CStudent的私有基类.
c-style cast则无所谓,直接把指针换一个类型.差不多相当于reinterpret_cast这种.
luciferisnotsatan 2012-04-19
  • 打赏
  • 举报
回复
C风格的,你把CPerson*转成double* 编译都不会出错
static_cast 不是随便什么都能转的。你用的是private继承。class CStudent : private CPerson

64,651

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧