假设
让
让
我们能否安全地假设
B
是 D
的基类(可能是虚拟的,可能是多重继承的,不一定是直接基类)。让
obj
成为类型为 D
的对象(不是 D
的子类 - 正好是 D
)。让
D * d = std::addressof(obj);
B * b = d;
我们能否安全地假设
(char*) d <= (char*) b && (char*) b < (char*) d + sizeof(D)
背景:这是成为一个例程的一步,用于确定某个对象是否已由放置new
在特定的aligned_storage
中创建。我需要确保如果是,则该对象的所有基对象的指针都指向aligned_storage
内的某个地址。
多重继承
(例如C同时继承A和B)。看起来你需要使用dynamic_cast
而不是直接转换。如果你有没有多重继承
的类,你将始终具有相同的地址。 - Pierre Emmanuel Lallemantdynamic_cast
。也就是说,b = d
并不一定意味着b
和d
具有相同的物理地址。 - ascheplerB
和D
以及B2
和D2
等各种组合,基本上可以找出答案。 - Lightness Races in Orbitobj
成为类型为D
的对象”时,它是否必须是最派生的对象?它可以是另一个对象的子对象吗?在后一种情况下 - 是的,虚基类的子对象可能位于其派生类对象之外。在菱形继承体系中,它必须位于至少一个分支上(只有一个虚基实例,但是有两个从中派生的子对象 - 他们不能都包含它)。 - Igor Tandetnik