gpt4 book ai didi

c++ - 为什么使用虚拟基类会改变复制构造函数的行为

转载 作者:IT老高 更新时间:2023-10-28 21:54:04 26 4
gpt4 key购买 nike

在以下程序中,a当 B 虚拟地从 A 派生并且复制 C(不是 B)的实例时,不会复制成员变量。

#include <stdio.h>

class A {
public:
A() { a = 0; printf("A()\n"); }

int a;
};

class B : virtual public A {
};

class C : public B {
public:
C() {}
C(const C &from) : B(from) {}
};

template<typename T>
void
test() {
T t1;
t1.a = 3;
printf("pre-copy\n");
T t2(t1);
printf("post-copy\n");
printf("t1.a=%d\n", t1.a);
printf("t2.a=%d\n", t2.a);
}

int
main() {
printf("B:\n");
test<B>();

printf("\n");

printf("C:\n");
test<C>();
}

输出:

B:
A()
pre-copy
post-copy
t1.a=3
t2.a=3

C:
A()
pre-copy
A()
post-copy
t1.a=3
t2.a=0

请注意,如果 B 通常从 A 派生(删除 virtual ),则 a被复制了。

为什么不是 a在第一种情况下复制(test<C>() B 虚拟派生自 A?

最佳答案

虚拟继承是一个有趣的野兽,因为复制构造不像通常那样“继承”。您的 A 基础是默认构造的,因为您没有明确地复制构造它:

class C : public B {
public:
C() {}
C(const C &from) : A(from), B(from) {}
};

关于c++ - 为什么使用虚拟基类会改变复制构造函数的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34993429/

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