C++ 通过指向派生类的指针访问类对象会打破严格的别名规则吗? void foobar(Base*Base) { 派生*派生=动态_转换(基本);//或静态_转换 派生->blabla=0xC0FFEE; 如果(基本->blabla==0xC0FFEE) ... }

C++ 通过指向派生类的指针访问类对象会打破严格的别名规则吗? void foobar(Base*Base) { 派生*派生=动态_转换(基本);//或静态_转换 派生->blabla=0xC0FFEE; 如果(基本->blabla==0xC0FFEE) ... },c++,C++,在具有严格别名的编译器上,“派生”是“基”的别名吗?只要有可能通过两个指针访问同一对象,两个指针就具有别名。本标准第3.10/15段规定了访问对象的有效时间 如果程序试图通过以下类型之一以外的左值访问对象的存储值,则行为未定义: 对象的动态类型 对象动态类型的cv限定版本 与对象的动态类型相对应的有符号或无符号类型 一种类型,它是与动态类型的cv限定版本相对应的有符号或无符号类型 对象, 在其成员中包括上述类型之一的聚合或联合类型(包括, 递归地,子集合或包含的并集的成员) 是对象动态类型的基

在具有严格别名的编译器上,“派生”是“基”的别名吗?

只要有可能通过两个指针访问同一对象,两个指针就具有别名。本标准第3.10/15段规定了访问对象的有效时间

如果程序试图通过以下类型之一以外的左值访问对象的存储值,则行为未定义:

  • 对象的动态类型
  • 对象动态类型的cv限定版本
  • 与对象的动态类型相对应的有符号或无符号类型
  • 一种类型,它是与动态类型的cv限定版本相对应的有符号或无符号类型 对象,
  • 在其成员中包括上述类型之一的聚合或联合类型(包括, 递归地,子集合或包含的并集的成员)
  • 是对象动态类型的基类类型(可能是cv限定的)
  • 字符或无符号字符类型
在您的例子中,
*派生的
要么是对象动态类型的l值,要么是对象动态类型的基类类型
*base
属于对象动态类型的基类类型

因此,您可以通过
派生的
基本的
访问对象,使两个指针具有别名

void foobar(Base* base)
{
    Derived* derived = dynamic_cast<Derived*>(base); // or static_cast
    derived->blabla = 0xC0FFEE;
    if (base->blabla == 0xC0FFEE)
        ...
}