关注
先说一下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
相关推荐
![](https://static.nowcoder.com/fe/file/oss/icon_job.png)
点赞 评论 收藏
分享
牛客热帖
正在热议
# 牛客帮帮团来啦!有问必答 #
1379592次浏览 19155人参与
# 每日一题挑战 #
1729次浏览 145人参与
# 不去互联网可以去金融科技 #
50110次浏览 515人参与
# 和牛牛一起刷题打卡 #
52291次浏览 4205人参与
# 如何写一份好简历 #
346612次浏览 4824人参与
# 非技术岗薪资爆料 #
57554次浏览 759人参与
# 极具前瞻性,现代汽车编程题 #
12623次浏览 232人参与
# 摸鱼打卡站 #
9334次浏览 521人参与
# 晒一晒我的offer #
4090245次浏览 60907人参与
# 提前批简历挂麻了怎么办 #
28271次浏览 523人参与
# 互联网公司评价 #
110415次浏览 1429人参与
# 在国企工作的人,躺平了吗? #
130184次浏览 1899人参与
# 简历中的项目经历要怎么写? #
20332次浏览 302人参与
# 运营人的第一份offer应该如何选 #
42760次浏览 701人参与
# 软件开发薪资爆料 #
907617次浏览 12178人参与
# 产品每日一题 #
4044次浏览 163人参与
# 通信和硬件还有转码的必要吗 #
12541次浏览 109人参与
# 海康威视求职进展汇总 #
131933次浏览 1438人参与
# 来聊聊你目前的求职进展 #
234853次浏览 2971人参与
# 实习学不到东西怎么办? #
41420次浏览 758人参与
# 正在实习的你,有转正机会吗? #
130573次浏览 1242人参与
# 24届软开秋招面试经验大赏 #
1259938次浏览 18875人参与