这是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/