关注
先说一下static_cast
用static_cast 转换的时候是不安全的,
该代码能将不是继承关系的指针转为b , 不会出现编译错误的前提是 声明的时候, 其余几个指针类型都是void*。
虽然可以转换, 但是也只是能调用函数,
不能正常输出成员变量的值, 因为static_cast不安全,
它会 将错误保留下去, 大家可以试试。
#include <iostream>
using namespace std;class x
{
public:
int i;
x(){i=1;}
virtual void f(){cout<<"x"<<endl;}
};
class a:public x
{
public:
int j;
a(){j=2;}
void f(){cout<<"a"<<endl;}
};
int main()
{
x *p1 = new x;
a *p2 = static_cast<a*>(p1);
p2->f();//x
cout<<p2->i<<endl;//1
cout<<p2->j<<endl;//0
return 0;
} //static_cast将一个指向x类型的指针转为指向a类型的指针, //虽然正确,但是不安全, 因为此时p2并不能访问j,它访问的是 //垃圾值. 如果使用dynamic_cast 他就会检查出这种不安全
//情况, 从而返回NULL.
另外,楼主的函数之所以会这样输出daxbe
我觉得是因为 每一个类都继承x, x中的函数是virtual类型的, 那派生类重写的函数也是virtual类型的, 既然是虚函数, 调用的时候就会去虚函数表中找函数地址,找虚函数表的时候不看指针类型,只看实际指向的内容(这就是能多态的一部分原因),因为他们实际指向各自的函数,所以最后会输出各自的结果。
至于楼上说的静态绑定,我觉得不对,静态绑定是指普通函数的调用使用的是静态绑定,一旦函数是虚函数,就不能是静态绑定的,一定是通过查表才决定绑定哪个函数。
我也是小白,如果大家有觉得我说的不对的地方,帮我指正啦。
查看原帖
点赞 1
相关推荐
点赞 评论 收藏
分享
点赞 评论 收藏
分享
03-28 20:13
东南大学 Java 点赞 评论 收藏
分享
牛客热帖
更多
正在热议
更多
# 你的实习产出是真实的还是包装的? #
37183次浏览 438人参与
# 网申一定要掌握的小技巧 #
20637次浏览 86人参与
# 厦门银行科技岗值不值得投 #
16269次浏览 359人参与
# AI替代不了什么? #
602次浏览 17人参与
# 面试紧张时你会有什么表现? #
34925次浏览 223人参与
# 学历VS实习,哪个更重要? #
3263次浏览 71人参与
# 一人一道大厂面试题 #
125150次浏览 1303人参与
# 机械人求职现状 #
39902次浏览 321人参与
# 分享一个让你热爱工作的瞬间 #
67436次浏览 500人参与
# 你的实习什么时候入职 #
367526次浏览 2362人参与
# 汇川技术求职进展汇总 #
189333次浏览 1065人参与
# uu们,春招你还来吗? #
66498次浏览 830人参与
# 面试中,你被问过哪些奇葩问题? #
98030次浏览 1347人参与
# 发工资后,你做的第一件事是什么 #
99827次浏览 320人参与
# 牛油的搬砖plog #
188706次浏览 1254人参与
# 一人分享一道面试手撕题 #
111584次浏览 2646人参与
# 面试被问到不会的问题,你怎么应对? #
28290次浏览 727人参与
# 你都用vibe coding做过什么? #
24549次浏览 926人参与
# 90后北漂现状 #
36200次浏览 214人参与
# 工作上你捅过哪些篓子? #
68675次浏览 318人参与
# 关于春招你都做了哪些准备? #
145379次浏览 767人参与
查看9道真题和解析