gpt4 book ai didi

c++ - 常规转换不会抛出运行时错误

转载 作者:行者123 更新时间:2023-11-28 03:31:10 25 4
gpt4 key购买 nike

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

#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;
}

最佳答案

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

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

关于c++ - 常规转换不会抛出运行时错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12587704/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com