c++ - 继承一个类,该类也继承与该类相同的基类

标签 c++ oop inheritance

对我来说,继承的一个优点是公共(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/

相关文章:

Python 'str' 对象在使用函数变量调用类实例时没有属性 'name'

c++ - 继承的成员函数似乎未声明,这是怎么回事?

c++ - 基类的虚拟方法被调用,而不是子类的重写实现

java - 以面向对象的方式思考

C++ - 初始化静态成员它自己的方法

inheritance - Laravel Eloquent 事件继承

c++ - 如何在 CListCtrl 中为单个项目加下划线

c++ - 检查输入是否为字母数字时出现逻辑错误

c++ - 在 MSDN 下载区找不到 C++ 6.0 IDE

c++ - 成员函数指针和虚类