c++ - 在此实例中,三元运算符与 C 风格的指针向上转换相结合是否会调用未定义的行为?

标签 c++ language-lawyer undefined-behavior conditional-operator upcasting

激励背景:在尝试调试软件中难以重现的故障条件时,我遇到了一些有问题的指针转换代码,这些代码是由一位天真的初级开发人员编写的(好吧,我承认,就是我) ,10 年前),我怀疑这可能是故障的根本原因。

我重写了代码以使用正确的 static_cast<>而是调用,并且自重写以来我还没有看到故障情况发生,但这并不一定意味着任何事情,因为无论如何很少发生故障;到目前为止,我可能只是“幸运”。

我的问题是:C 风格的指针向上转换是否在 main() 内执行?在下面的代码中调用未定义的行为?或者它只是丑陋,但从语言律师的角度来看仍然是良好的?

#include <stdio.h>
#include <stdlib.h>

class BaseClass
{
public:
   BaseClass() {}
   virtual ~BaseClass() {}

   virtual void Foo() {printf("BaseClass::Foo() called\n");}
};

class SubClassA : public BaseClass
{
public:
   SubClassA() {}

   virtual void Foo() {printf("SubClassA::Foo() called\n");}
};

class SubClassB : public BaseClass
{
public:
   SubClassB() {}

   virtual void Foo() {printf("SubClassB::Foo() called\n");}
};

int main(int, char **)
{
   SubClassA a;
   SubClassB b;

   // Warning:  questionable C-style casting follows...
   BaseClass * p = (rand()%2) ? ((BaseClass*)(&a)) : ((BaseClass*)(&b));
   p->Foo();

   return 0;
}

最佳答案

Actor 阵容完全合法。来自 [expr.cast]/4.6

a pointer to an object of derived class type or an lvalue or rvalue of derived class type may be explicitly converted to a pointer or reference to an unambiguous base class type, respectively;

关于c++ - 在此实例中,三元运算符与 C 风格的指针向上转换相结合是否会调用未定义的行为?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63195504/

相关文章:

我可以通过为封闭结构分配更多空间来 "over-extend"数组吗?

c++ - 在 C++ 中使用后递增变量未定义行为访问数组元素吗?

c++ - ADL 没有找到模板化的自由函数

C++ 删除所有文件和子文件夹但保留目录本身

c# - 用于 GUI 编程的 C++ 与 C#

python - 为什么 Python 2 在使用 "import ... as ..."时尝试获取模块作为包属性?

c++ - 如何禁止获取对象的地址

c++ - 名称查找歧义不一致

c++ - 对假设数组元素的访问肯定是 UB 吗?

c - 以下哪些后自增和预自增运算符的组合在 C 语言中具有未定义的行为?