考虑以下示例代码。

#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中的dummy是安全的。

在Line2中,我将基类对象的地址传递给函数。因此,函数static_cast中的dummy不安全。

但是当我执行代码时,程序表现正常。我认为,通过not safe这个词,程序应该在运行时崩溃。但是没有发生崩溃。

这是我得到的输出。
derived::func()
derived::func()

程序在运行时没有崩溃的原因是什么?

最佳答案

由于未定义的行为意味着可能发生任何事情,而不一定是崩溃。

在大多数编译器上,我已经看到,调用一个不访问virtual指针上的类成员的non-NULL方法是可行的,但是它仍然是未定义的。

关于c++ - 为什么使用static_cast运算符进行不安全的转换不会崩溃?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11538080/

10-12 12:42
查看更多