这是2个代码
第一:

#include<iostream>
using namespace std;

class A{
  public:
     virtual void  f()
    {
      cout<<"A"<<endl;
    }
};
class B: public A{
  public:
    virtual void  f()
    {
      cout<<"B"<<endl;
    }
};
int main()
{
  A* pa=new A();
  B* pb=new B();
  A* upCastpa= static_cast<A*>(pb);
  B* downCastpb=static_cast<B*>(pa);
  upCastpa->f();
  downCastpb->f();
  return 1;
}

一台显示器
B
A

因此,我认为真正重要的是指针指向的对象。
但是,如果我删除虚拟形式A::f(),就像这样;
#include<iostream>
using namespace std;

class A{
  public:
     void  f()
    {
      cout<<"A"<<endl;
    }
};
class B: public A{
  public:
    virtual void  f()
    {
      cout<<"B"<<endl;
    }
};
int main()
{
  A* pa=new A();
  B* pb=new B();
  A* upCastpa= static_cast<A*>(pb);
  B* downCastpb=static_cast<B*>(pa);
  upCastpa->f();
  downCastpb->f();
  return 1;
}

代码将显示
一种
“停”
发生了什么?如果重要的是反对的指针指向。

它应该显示
一种

而不是损坏。

发生了什么?

我真的很感谢任何建议或指示。非常感谢。

最佳答案

不管是否存在virtual函数:

A* pa=new A();
B* downCastpb=static_cast<B*>(pa);

导致未定义行为

当您使用static_cast将对象强制转换为不是该对象的类型时,它将导致未定义的行为。一旦有了产生未定义行为的代码,尝试为观察到的输出找到理由是没有用的。编译器可以自由显示任何行为,崩溃,奇怪的结果或绝对正确的工作代码。您完全可以依靠编译器。

引用:

C++ 11标准5.2.9 [expr.static.cast]

关于c++ - 当我们尝试访问带有或不带有虚函数的向下转换指针时发生了什么,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12956399/

10-13 00:05