【问题标题】:Regular cast doesnot throw runtime error常规转换不会引发运行时错误
【发布时间】:2012-09-17 06:01:38
【问题描述】:

如果我们看到下面的代码,fun 函数将 C 的对象转换为 B 的对象并调用 B 自己的函数。它怎么不给出段错误。我认为这会导致崩溃。 我的程序没有崩溃。任何人都可以解释为什么它工作正常。

#include<iostream>
using namespace std;
class A{
public:
   A() {cout<<"A's Con\n"; }
   ~A() {cout<<"A's De\n"; }
};
class B :public A
{
public:
   B() {cout<<"B's Con\n"; }
   ~B() {cout<<"B's De\n"; }
   void printb(){cout<<"B print function\n";}
   void printb2(){cout<<"B print2 function\n";}
};
class C :public A
{
public:
   C() {cout<<"C's Con\n"; }
   ~C() {cout<<"C's De\n"; }
   void printc(){cout<<"C print function\n";}
};
void fun(A *ap)
{
   B *bp = (B*) ap;
   bp->printb2();
}

int main()
{
   C c;
   fun(&c);
   return 0;
}

【问题讨论】:

  • 未定义的行为,任何事情都可能发生。
  • 正确的缩进和正确的英文会有所帮助
  • sry.. 写的时候注意力不集中
  • 嗨,我如何在不使用 dynamic_cast 的情况下进行运行时类型检查,我不想使用 dynamic_cast ,我可以使用 static_cast 或任何其他////

标签: c++ inheritance casting static-cast


【解决方案1】:

您正在调用未定义的行为。关于未定义行为的第一条规则是任何事情都可能发生。您的程序可能会崩溃,或者可能会成功运行。它可能看起来成功地工作,然后在几小时后以“不可能”的方式崩溃。它甚至可能会向您的老板发送不适当的电子邮件或擦除您的硬盘驱动器。对于随机的良性错误来说,这当然不太可能发生,但如果您的程序是网络浏览器,那么它肯定会被利用来做任何攻击者可能想做的事情。

永远不要依赖未定义的行为。始终解决根本问题。使用Valgrind、Application Verifier 等工具来帮助您发现并不总是导致崩溃的细微错误。从长远来看,这将使您的软件更加可靠。

【讨论】:

  • 非常感谢。我们可以在检查对象的 typeid 后使用静态转换(使用 RTTI)我正确吗?
  • 嗨...任何人都可以建议如何为上述要求编写代码
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多