永发信息网

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

答案:2  悬赏:60  手机版
解决时间 2021-04-25 01:05
  • 提问者网友:骨子里的高雅
  • 2021-04-24 00:08
如题。。
最佳答案
  • 五星知识达人网友:杯酒困英雄
  • 2021-04-24 01:04

你是指的类型转换么?


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


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


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

全部回答
  • 1楼网友:底特律间谍
  • 2021-04-24 02:31
我先澄清一下 派生类指针在运行时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; }
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯