我在接受采访时被问到这个问题,我不确定以下情况中的行为:
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
的对象?
有人可以帮助我确切地说,预测也会影响访问吗?
答案 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.
}