编辑:哎呀!我在下面发布了答案,因为我误读了您的帖子。我以为你说 Boost 库使用组合而不是继承,而不是相反。不过,如果它对任何人都有用...(请参阅 EDIT2 了解我认为可能是您问题的答案。)
我不知道 Boost Parameter Library 的具体答案。但是,我可以说这通常是一个更好的选择。原因是每当您可以选择以多种方式实现关系时,您应该选择最弱的一种(低耦合/高内聚)。因为继承比组合强...
请注意,有时使用私有继承也会使实现异常安全代码变得更加困难。以operator==
为例。使用组合,您可以创建一个临时并使用提交/回滚逻辑进行分配(假设对象的正确构造)。但是如果你使用继承,你可能会在派生类的Base::operator==(obj)
内部做一些事情。operator==
如果该Base::operator==(obj)
调用抛出,您将冒着保证的风险。
编辑2: 现在,试图回答你真正问的问题。这是我从您提供的链接中可以理解的。由于我不知道图书馆的所有细节,如果我错了,请纠正我。
当您将组合用于“实现方式”时,您需要为委派提供一层间接性。
struct AImpl
{
//Dummy code, just for the example.
int get_int() const { return 10; }
};
struct A
{
AImpl * impl_;
int get_int() const { return impl->get_int(); }
/* ... */
};
在启用参数的构造函数的情况下,您需要创建一个实现类,但您仍然应该能够以透明的方式使用“包装器”类。这意味着在您提到的链接的示例中,希望您可以myclass
像操作一样操作myclass_impl
。这只能通过继承来完成。(请注意,在示例中,继承是公共的,因为它是 struct 的默认值。)
我假设myclass_impl
它应该是“真正的”类,具有数据、行为等的类。然后,如果你有一个类似的方法get_int()
并且如果你不使用继承,你将被迫只写一个包装get_int()
器myclass
就像我上面做的那样。