仍然需要空类的链式继承吗?

时间:2019-01-18 00:47:43

标签: c++ c++11 multiple-inheritance base-class empty-class

是否仍然有充分的理由使用链式基本案例而不是统一的多重继承?

过去,某些类被设计为链式继承。我认为这是为了强制空基类优化。 我了解这就是Boost.Operators的设计方式。

struct empty{};

template<class Base = empty>
struct A : Base{}; 

template<class Base = empty>
struct B : Base{}; 

template<class Base = empty>
struct C : Base{};

struct S : A<B<C<>>>{};

int main(){static_assert(sizeof(S)==1, "!");}

是否需要在新的编译器中(今天是2019年)进行此操作,或者我可以放弃所有这些复杂性并可以正常继承吗?

struct A{}; 

struct B{}; 

struct C{};

struct S : A, B, C{};

int main(){static_assert( sizeof(S) == 1 , "!");}

它是否已用于任何主要目的或次要目的?

1 个答案:

答案 0 :(得分:2)

[class.derived]/7 中的标准规定:

  

基类子对象的大小可能为

这意味着编译器无需强制实施EBO。但是几乎所有的编译器都实现了它。

从C ++ 20开始,有[[no_unique_address]]属性可以应用于空成员子对象:

  

如果空成员子对象使用属性[[no_unique_address]],则允许它们像空基一样进行优化。取此类成员的地址将导致其地址可能等于同一对象的其他某些成员的地址。