1

考虑以下示例代码。

#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_castin 函数dummy是不安全的。

但是当我执行代码时,程序运行正常。我想,按这个词not safe,程序应该在运行时崩溃。但没有发生崩溃。

这是我得到的输出。

derived::func()
derived::func()

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

4

2 回答 2

10

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

在我见过的大多数编译器上,调用一个virtual不访问NULL指针上的类成员的非方法是有效的,但它仍然是未定义的。

于 2012-07-18T09:18:10.617 回答
6

C++ 的核心概念之一是未定义行为。当您执行导致未定义行为的操作时,例如静态转换一个不指向转换类型对象的指针,您的程序的行为实际上是未定义的:该标准没有定义任何特定行为。平台不需要做任何具体的事情,它显示的任何行为都可以根据标准进行。

这种未定义的行为包括默默地做对你来说看起来像正常行为的事情。不能保证分段错误或任何其他诊断。

于 2012-07-18T09:22:03.287 回答