向下转换和虚函数

Downcasting and Virtual Functions

本文关键字:函数 转换      更新时间:2023-10-16

我在面试中被问到这个问题,我不确定在以下情况下的行为:

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

如果

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

由于虚拟关键字,BObj是否可以访问B的方法?还是因为它指向AObj的对象而不能访问B的方法?

有人能帮助我如何准确地下降影响访问也?

将基类对象的地址赋值给派生类指针是未定义行为。所以任何事情都可能发生:调用BObj的函数可以调用B的函数,可以调用A的函数,可以使程序崩溃,甚至格式化您的硬盘。这取决于编译器和它的优化选项。

首先,做这个

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.
}

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