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;
}
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯