如何最好地将私有继承暴露给基类?

时间:2016-01-14 16:17:32

标签: c++ inheritance multiple-inheritance private-inheritance

我正在设计一个对象层次结构,其中所有对象的基类都是Node,预计会被子类化。 Node的子类将包含子项,但子类的类型可能因子类而异。

我通过私有继承Owner<>类来实现子项的所有权,std::vector类只是#include <vector> using namespace std; //Class to contain child items template <typename T> struct Owner { vector<T> children; }; //Types of children that can be owned by nodes in the hierarchy struct ChildType1{}; struct ChildType2{}; struct ChildType3{}; //Node base class template <typename DERIVED_T> struct Node { Node(DERIVED_T& _derivedThis): derivedThis(_derivedThis) {} template <typename ITEM_T> void AddItem() { /*Possibly do a lot of pre-checks here before adding a child*/ derivedThis.Owner<ITEM_T>::children.emplace_back(); } //Reference to the most-derived subclass instance DERIVED_T& derivedThis; }; //A possible subclass of Node struct DerivedNode: private Owner<ChildType1>, private Owner<ChildType2>, public Node<DerivedNode> { friend struct Node<DerivedNode>; DerivedNode(): Node(*this) {} }; int main() { DerivedNode d; d.AddItem<ChildType1>(); d.AddItem<ChildType2>(); //d.AddItem<ChildType3>(); //Fails to compile (intended behavior; DerivedNode should not own ChildType3 objects) return 0; } 的包装器。我想将此所有权公开给基类(但没有其他人),因为在添加和删除子项时会有很多重复。所以我想出了这个:

{{1}}

这种方法感觉有点乱,因为我在基类中存储了对派生类的引用(我之前从未见过)。这是好习惯吗?在处理基类中的通用子维护时,是否有更好的方法在派生类中保留子项所有权?

1 个答案:

答案 0 :(得分:3)

你快到了。不要在DERIVED_T中存储对Node的引用。只需写下:

     auto derivedThis& = *static_cast<DERIVED_T*>(this);

在每个需要它的函数中。 (或const DERIVED_T*视情况而定)。