Одним из преимуществ наследования для меня является то, что публичные методы пишутся один раз в базовом классе, и каждый наследующий класс автоматически имеет этот метод.
Теперь, например, допустим, что я хочу предоставить каждому классу в моем программном обеспечении метод «подкачки». Класс, обеспечивающий эту функциональность, выглядит следующим образом:
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'.
Прежде всего, я прав до сих пор? Я хотел бы знать наверняка, что это поведение невозможно.
Во-вторых, почему наследование так плохо поддерживается за одним уровнем? Это так здорово написать метод один раз, а затем позволить всем объектам наследовать от него. Даже если один и тот же объект появляется более одного раза в классе различными способами.