考虑以下示例代码。
#include <iostream>
using namespace std;
class base
{
public:
void func()
{
cout << "base::func()" << endl;
}
};
class derived : public base
{
public:
void func()
{
cout << "derived::func()" << endl;
}
};
void dummy(base *bptr)
{
derived *dptr = static_cast<derived*> (bptr);
dptr->func();
}
int main()
{
base bob1;
derived dob1;
dummy(&dob1); //Line1
dummy(&bob1); //Line2
}
在 Line1 中,我将派生类对象的地址传递给函数dummy
,该函数接受一个指向基类对象的指针。所以static_cast
函数中的 indummy
是安全的。
在 Line2 中,我将基类对象的地址传递给函数。所以static_cast
in 函数dummy
是不安全的。
但是当我执行代码时,程序运行正常。我想,按这个词not safe
,程序应该在运行时崩溃。但没有发生崩溃。
这是我得到的输出。
derived::func()
derived::func()
程序在运行时没有崩溃的原因是什么?