在 C++11 (N3485) 10.1.4 [class.mi] 中它说:
对于最派生类的类格中非虚拟基类的每次不同出现,最派生对象应包含该类型的相应不同基类子对象。
对于指定为virtual的每个不同的基类,最派生类应包含该类型的单个基类对象。
考虑以下 C++11 代码:
struct B {};
struct BV : virtual B {};
struct BN : B {};
struct C1 : BV, BN {};
struct C2 : BV, BN {};
struct D : C1, C2 {};
首先,为了清楚起见,D 的类格有多少个顶点?
其次,标准要求 D 类型的最派生对象具有多少个 B 类型的不同子对象?
更新:
以下哪个是类格?
(1)
B B B B
^ ^ ^ ^
| | | |
BV BN BV BN
^ ^ ^ ^
| | | |
\ / \ /
C1 C2
\ /
\ /
- D -
(2)
B<---------
^ \
| |
| B | B
| ^ | ^
| | | |
BV BN BV BN
^ ^ ^ ^
| | | |
\ / \ /
C1 C2
\ /
\ /
- D -
(3)
B
/ \
/ \
BV BN
| \ / |
| \/ |
| / \ |
| / \|
C1 C2
\ /
\ /
D
如果意图是(1),那么是否不可能有任何不是树的 DAG?(即钻石是不可能的)如果是这样,称它为类树不是更好吗?
如果是(2),那么说“对于类格中基类的每次出现,都有一个相应的基类子对象”是否足够?也就是说,如果格的构造已经依赖于虚拟和非虚拟基类关系来选择边和顶点?
如果是(3),那么标准中的语言是否不正确,因为在类格中只能出现一次类?