向下转型和虚拟功能

时间:2015-08-03 08:09:00

标签: c++ inheritance polymorphism downcast

我在接受采访时被问到这个问题,我不确定以下情况中的行为:

class A 
{ 
      virtual fun1(){...}
      virtual fun2(){...}
};

class B : public A
{ 
      virtual fun1(){...}
      virtual fun2(){...}
};

现在,如果,

A* AObj = new A;
B* BObj = (B*) AObj;

BObj是否可以访问B&B的方法,因为虚拟关键字或不是因为它指向AObj的对象?

有人可以帮助我确切地说,预测也会影响访问吗?

3 个答案:

答案 0 :(得分:4)

将基类对象的地址分配给派生类指针是undefined behavior。所以任何事情都可能发生:调用BObj的函数可以调用B的函数,可以调用A的函数,可以使程序崩溃,甚至格式化你的硬盘。这将取决于编译器及其优化选项。

答案 1 :(得分:1)

在这种情况下(多态),指针的类型(BObj,这里的类型不是B)是它指向的对象的类型(A)。 所以BObj是Base类的对象,并且无法在derieved类(B)中定义的额外工作(函数)。

答案 2 :(得分:1)

首先,这样做

A* AObj = new AObj();

B* BObj = AObj;

根本不安全,因为它将基类对象(Parent)的地址分配给派生类(Child)指针。因此,代码期望基类对象具有派生类属性。

但是你可以这样做:

    A* AObj = new AObj();

    B* BObj = dynamic_cast<B*>AObj;

这将检查是否可以将Aobj分配给Bobj。如果可以,它返回对象的地址,否则返回0。

所以你可以像:

一样使用它
B* BObj = dynamic_cast<B*>AObj;
if(BObj)
{
    //Now you can use it safely.
}