对我来说,继承的一个优点是公共(public)方法只在基类中编写一次,每个继承类也自动拥有该方法。
现在举例来说,我想为我的软件中的每个类提供一个“交换”方法。提供此功能的类如下所示:
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”方法。
首先,到目前为止我是对的吗?我想确定这种行为是不可能的。
其次,为什么在一层之后的继承支持如此糟糕?写一次方法,然后让所有的对象继承它,真是太酷了。即使同一个对象以各种方式在一个类中出现多次。
最佳答案
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++ - 继承一个类,该类也继承与该类相同的基类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55593903/