假设代码是这样的:
#include <iostream>
using namespace std;
class dog
{
public:
virtual ~dog()
{
}
};
class yellowdog : public dog
{
int age;
public:
void bark() { cout << "woof." << endl;}
};
int main()
{
dog *pd = new dog();
yellowdog *py = dynamic_cast<yellowdog*>(pd);
py->bark();
cout << "py = " << py << endl;
cout << "pd = " << pd << endl;
}
Run Code Online (Sandbox Code Playgroud)
输出:
woof.
py = 0x0
pd = 0x7fd4d34000e0
Run Code Online (Sandbox Code Playgroud)
我明白了为什么PY = 0.我知道,有一个运行时检查,并在运行时检查,有一项不合格转换dog到yellowdog,PY = 0,因此价值.
我的问题是为什么py->bark()仍然可以工作.为什么它仍然能够打印出"低音".
我以前对代码道歉.现在检查..
py是一个空指针,因此py->bark()调用未定义的行为.任何事情都可能发生,包括似乎有效的事情.与Java或C#不同,如果访问空指针,C++无法保证立即失败.在效率方面,C++编译器通常会忽略空指针检查.
碰巧,bark()根本不使用this,所以它可以正常工作也就不足为奇了.你不应该依赖它 - 不能保证它会起作用 - 但这并不奇怪.