继承与此类相同的基类的类的继承
Posted
技术标签:
【中文标题】继承与此类相同的基类的类的继承【英文标题】:Inheritance of a class that also inherits the same base class as this class 【发布时间】:2019-04-09 13:18:59 【问题描述】:继承对我来说的一个好处是,公共方法在基类中编写一次,每个继承类也自动拥有该方法。
例如,假设我想为我的软件中的每个类提供一个“交换”方法。提供此功能的类如下所示:
template< typename... DataMembers >
class SwapMethodProvider
public:
inline void Swap( SwapMethodProvider& other );
private:
std::tuple< DataMembers... > member_dataMembers;
;
template< typename... DataMembers >
inline void SwapMethodProvider< DataMembers... >::Swap( SwapMethodProvider& other )
// Swap between the tuples that contain the data members
std::swap( member_dataMembers, other.member_dataMembers );
现在,如果只有一个类从它继承,那么一切都很好。但是,如果我希望我的软件中的每个类都继承自它,那么以下方法将不起作用,因为直接基类由于歧义而无法访问:
class ExtraSauce : public SwapMethodProvider< int, double >
;
class EvenMoreExtraSauce : public ExtraSauce, public SwapMethodProvider< int, double >
;
然后第一个类“ExtraSauce”可以正常工作,但“EvenMoreExtraSauce”将无法编译。现在我明白了为什么它不能编译,但剩下要做的就是将类的“SwapMethodProvider”实例存储为数据成员。我的问题只是重复代码,因为每个类都需要有自己的“Swap”方法来调用“SwapMethodProvider”实例的“Swap”方法。
首先,到目前为止我是对的吗?我想确定这种行为是不可能的。
其次,为什么继承在一层后面支持得这么差?一次编写一个方法,然后让所有对象都继承它,真是太酷了。即使同一个对象以各种方式在一个类中出现不止一次。
【问题讨论】:
继承受到严重支持的情况并非如此,但继承本身在某些时候变得令人讨厌。考虑到继承不是圣杯,也许看看std::swap
,实际上根本不需要继承来交换任意类型
假设它可以编译。当您在 EvenMoreExtraSauce 上调用 Swap 时,您期望哪种行为?
类似于构造函数的行为,可以有特殊方法为所有基类调用相同的方法
It compiles jolly well。请发帖minimal reproducible example。
如果您尚未在 EvenMoreExtraSauce 中定义调用 ExtraSauce::Swap 的 Swap 方法,则/或 SwapMethodProvider::Swap。编译器应如何分析 EvenMoreExtraSauce ::Swap ?是 ExtraSauce::Swap 还是 SwapMethodProvider::Swap。在构造函数中,默认情况下它会为每个类调用默认构造函数,但对于方法,它不能选择任意选项。
【参考方案1】:
CRTP。
template <class Parent, typename... DataMembers>
class SwapMethodProvider ... ;
class ExtraSauce : public SwapMethodProvider <ExtraSauce, int, double> ;
class EvenMoreExtraSauce : public ExtraSauce,
public SwapMethodProvider<EvenMoreExtraSauce, int, double> ;
【讨论】:
非常感谢!!在一些帮助下通过这个很有趣以上是关于继承与此类相同的基类的类的继承的主要内容,如果未能解决你的问题,请参考以下文章