void foobar(Base* base)
{
Derived* derived = dynamic_cast<Derived*>(base); // or static_cast
derived->blabla = 0xC0FFEE;
if (base->blabla == 0xC0FFEE)
...
}
Run Code Online (Sandbox Code Playgroud)
在具有严格别名的编译器上,"派生"是"base"的别名吗?
只要有可能通过它们访问同一个对象,就会有两个指针别名.该标准的第3.10/15段规定了对对象的访问何时有效.
如果程序试图通过不同于以下类型之一的左值访问对象的存储值,则行为未定义:
- 对象的动态类型,
- 一个cv限定版本的动态类型的对象,
- 与对象的动态类型对应的有符号或无符号类型的类型,
- 一种类型,是有符号或无符号类型,对应于对象动态类型的cv限定版本,
- 一种聚合或联合类型,包括其成员中的上述类型之一(包括递归地,子聚合或包含联合的成员),
- 一个类型,它是对象动态类型的(可能是cv限定的)基类类型,
- char或unsigned char类型.
在您的情况下,*derived它是对象的动态类型的l值,或者是对象的动态类型的基类类型.*base是一种类型,它是对象动态类型的基类类型.
因此,你被允许通过这两种访问对象derived和base,使得别名两个指针.
| 归档时间: |
|
| 查看次数: |
304 次 |
| 最近记录: |