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

问题描述 投票:0回答:1

继承的一个优点是公共方法在基类中编写一次,每个继承类也自动具有该方法。

现在举个例子,假设我想在我的软件中使用'swap'方法提供每个类。提供此功能的类如下所示:

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'方法。

首先,到目前为止我是对的吗?我想知道这种行为是不可能的。

其次,为什么继承在一个级别后得到如此严重的支持?编写一个方法然后让所有对象继承它是如此的酷。即使同一个对象以各种方式出现在课堂上的次数也多一次。

c++ oop inheritance
1个回答
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> {};
© www.soinside.com 2019 - 2024. All rights reserved.