【问题标题】: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 时,您期望哪种行为?
  • 类似于构造函数的行为,可以有特殊方法为所有基类调用相同的方法
  • 如果您尚未在 EvenMoreExtraSauce 中定义调用 ExtraSauce::Swap 的 Swap 方法,则/或 SwapMethodProvider::Swap。编译器应如何分析 EvenMoreExtraSauce ::Swap ?是 ExtraSauce::Swap 还是 SwapMethodProvider::Swap。在构造函数中,默认情况下它会为每个类调用默认构造函数,但对于方法,它不能选择任意选项。

标签: c++ oop inheritance


【解决方案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> {};

【讨论】:

  • 非常感谢!!在一些帮助下通过这个很有趣
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-14
  • 2014-04-19
相关资源
最近更新 更多