继承与此类相同的基类的类的继承

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> ;

【讨论】:

非常感谢!!在一些帮助下通过这个很有趣

以上是关于继承与此类相同的基类的类的继承的主要内容,如果未能解决你的问题,请参考以下文章

从继承的类中覆盖虚拟方法但保留基类的注释[重复]

大型程序的工具——多重继承与虚继承

类的继承与派生

构造函数继承问题c

C# 包含继承类的基类数组,访问非继承字段

13 继承