向下转型和虚函数

Vis*_*air 1 c++ polymorphism inheritance downcast

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

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

class B : public A
{ 
      virtual fun1(){...}
      virtual fun2(){...}
};
Run Code Online (Sandbox Code Playgroud)

现在如果,

A* AObj = new A;
B* BObj = (B*) AObj;
Run Code Online (Sandbox Code Playgroud)

是否BObj因为 virtual 关键字而可以访问 B 的方法,或者是否因为它指向 的对象而不能访问AObj

有人可以帮助我了解向下转型到底如何影响访问吗?

Pet*_*etr 5

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