Наследование класса, который также наследует тот же базовый класс, что и этот класс - PullRequest
0 голосов
/ 09 апреля 2019

Одним из преимуществ наследования для меня является то, что публичные методы пишутся один раз в базовом классе, и каждый наследующий класс автоматически имеет этот метод.

Теперь, например, допустим, что я хочу предоставить каждому классу в моем программном обеспечении метод «подкачки». Класс, обеспечивающий эту функциональность, выглядит следующим образом:

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', который вызывает метод 'Swap' экземпляра 'SwapMethodProvider'.

Прежде всего, я прав до сих пор? Я хотел бы знать наверняка, что это поведение невозможно.

Во-вторых, почему наследование так плохо поддерживается за одним уровнем? Это так здорово написать метод один раз, а затем позволить всем объектам наследовать от него. Даже если один и тот же объект появляется более одного раза в классе различными способами.

1 Ответ

1 голос
/ 09 апреля 2019

CRTP.

template <class Parent, typename... DataMembers> 
class SwapMethodProvider { ... };
class ExtraSauce : public SwapMethodProvider <ExtraSauce, int, double> {};
class EvenMoreExtraSauce : public ExtraSauce, 
                           public SwapMethodProvider<EvenMoreExtraSauce, int, double> {};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...