gpt4 book ai didi

c++ - 虚拟基类子对象的多个实例(真的)——不可能吗?

转载 作者:行者123 更新时间:2023-11-30 02:06:10 27 4
gpt4 key购买 nike

给定代码:

#include <cassert>


struct X {};

struct Y1: virtual X {};
struct Y2: virtual X {};
struct Y3: virtual X {};
struct Y4: virtual X {};

struct Z1: Y1, Y2 {};
struct Z2: Y3, Y4 {};

struct XYZ: Z1, Z2 {};


int main() {
XYZ xyz;

X *x1 = static_cast<Y1*>(&xyz);
X *x2 = static_cast<Y2*>(&xyz);
X *x3 = static_cast<Y3*>(&xyz);
X *x4 = static_cast<Y4*>(&xyz);

assert( x1 == x2 ); //first pair, ok
assert( x2 == x3 ); //can we make this one fail?
assert( x3 == x4 ); //second pair, ok


return 0;
}

我们可以让第二个断言失败吗?

换句话说,当我们有一个双菱形继承图并且希望在最派生的对象中为两个菱形的顶部有单独的子对象时就是这种情况。

标准 (2003, 10.1.4) 的措辞似乎禁止这样做,如果确实如此,后续问题是:我们是否没有提供精确的 virtual-over-multiply-included 子对象结构操作的方法,为什么?

最佳答案

一旦一个基被声明为虚拟的,该虚拟基的所有源都被折叠到该类型的一个基中,它不会让你在层次结构的中途将它分开(你没有什么可以对 child 说去虚拟化 parent )。需要明确的是,从非虚拟继承基础的不同类继承将导致另一个实例。您可以在 XYZ 中使用组合来创建两个实例而不是继承,然后使用普通接口(interface)进行适当的委托(delegate)。

关于c++ - 虚拟基类子对象的多个实例(真的)——不可能吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8993875/

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