【发布时间】:2019-06-12 06:25:01
【问题描述】:
是否还有充分的理由使用链式基本案例而不是平面多重继承?
过去,有些类被设计成链式继承。我认为这是强制空基类优化。 我知道这就是 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 , "!");}
它是否有任何主要或次要目的?
【问题讨论】:
-
你应该引入一些虚函数。然后它可能会与更多的编译器相关。
-
@Justin,好的,那么对于没有非常大的类来说,VisualStudio 仍然需要它(并且他们想出了自己的解决方法。)
-
EBO 是可选的,因此在这两种情况下,assert 都可能触发。
-
@Jarod42,编译器可以选择 EBO 来实现吗?我猜这种疯狂会在 C++ 重新发现 0 时结束。(当
sizeof(S) == 0)open-std.org/JTC1/SC22/WG21/docs/papers/2016/p0146r1.html
标签: c++ c++11 multiple-inheritance base-class empty-class