永发信息网

c++中,定义为指向基类对象的指针,在运行期间可重新指向其派生类对象。。那么反过来可不可以?

答案:2  悬赏:60  手机版
解决时间 2021-04-25 01:05
如题。。
最佳答案

你是指的类型转换么?


向上转换是100%可以的,向下转换需要看类型之间的关系,


比如说A a = getA() ; B b = (B) a; 其中B是A的派生类


如果a是B或其派生类实例,转换是可以的,如果a只是A对象的实例,那么转换不能成功

全部回答
我先澄清一下 派生类指针在运行时cast为基类指针,这是一般的多态实现,也就是你标题里说的基类指针运行时指向派生类对象,这类操作有个专门的名称叫做upcast。 与之对应的downcast,也就是你说的"反过来"——基类指针在运行时cast为派生类指针。 upcast没有问题的,因为基类总是子类的一种一般形式,但downcast时,基类可以有多个选择,只有根据对象的实例转换到正确的派生类对象指针上,才能安全地执行该对象的操作: c++提供了RTTI和dynamic_cast两种方式,我给你写个dynamic_cast的例子, 如果基类指针能被安全地cast到派生类,那么dynamic_cast返回一个指针,否则返回0 #include <iostream> using namespace std; class A { public: virtual void f() { cout << "A::f()" << endl; } }; class B : public A { public: virtual void f() { cout << "B::f()" << endl; } }; class C : public A { public: virtual void f() { cout << "C::f()" << endl; } }; int main() { A* a = new B; // upcast a->f(); B* b = dynamic_cast< B* >( a ); if ( b ) b->f(); else cout << "downcast到类型B失败" << endl; C* c = dynamic_cast< C* >( a ); if ( c ) c->f(); else cout << "downcast到类型C失败" << endl; return 0; }
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
终极三国里小乔会和周瑜在一起吗?
如何在百度上删除自己帖子里的留言?
双双饭店地址在什么地方,想过去办事
为什么隐藏不了空间的图标
sorry是什么意思
如何为DNS服务器的数据库区域设置老化清理?
DNF河北一区我花150万买了把+11的,45蓝色寒
黄金汤姆逊在哪里
耳根子软是什么意思,右耳朵下面有痣代表什么
赛尔号打钢牙鲨
新加坡6120诺基亚不能上网
男人只会说女人是会包装自己的动物,但是你们
黑龙江省汤原县公安局香兰分局这个地址在什么
终极三国里的包包哪里有卖的
天津去塘沽怎么坐车,天津滨海新区到北京怎么
推荐资讯
二年级夏天的好词佳句,夏季天气忽冷忽热祝福
冲3000CF点有送GP吗
比赛型机器人自学
我去年怀孕三个月因宝宝停止生长我给做掉了,
谁有暮光之城新月的电影啊?
excel自由筛选后,选择查找的目标栏,为什么
浙江义呜批发市场
鬼剑士怎么升级快点??
有关人格修养的事例
结合菌素阳性是什么原因
馒头会爱上土坷垃么?
汽车的扭矩、轴矩是啥意思,有啥用?单位是长
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?