c++ - 在 C++ 的模板化子类中继承模板化基类方法而不列出每个方法

标签 c++ templates inheritance

在 Java 中,容器有一个详细的通用类层次结构。 Java定义了类似ICollection的接口(interface),ISet继承了ISet,IList继承了ArrayList实现。我想在我正在创建的 C++ 库中创建一个类似的层次结构。

但是,使用 C++ 模板会使这变得非常麻烦。例如,假设我定义了一个 ISet:

    template<typename T>
    class ISet
    {
    public:
        virtual ~ISet() = 0;
        virtual void add(T e) = 0;
        virtual size_t size() = 0;
        virtual bool isEmpty()
        {
            return size() == 0;
        }
    };

然后,如果我想制作一个实现 ISet 的 List,我必须在类定义中列出我想继承但不重写的每个方法,以便稍后调用它没有像 alist::ISet->isEmpty():

这样的乱七八糟的东西
template<typename T>
class List : public ISet<T>
{
public:

    ...

    void add(T e)
    {
        ...
    }

    virtual sz size()
    {
        ...
    }

    using ISet<T>::isEmpty; //well this is annoying
};

我理解其中的原因,并且“为什么它没有按我预期的方式工作?”这些问题已得到解答:herehere .

我的问题是,是否有一种干净(甚至是任何!)的方法来实现这一点,而不必显式列出每个基类中继承但未覆盖的方法?

我真正想要的是可以放入 List 中的内容,例如:

using ISet<T>::*;

这将使 ISet 中的所有方法都依赖于 List 的类定义,并将它们别名为 List::functionName。

请告诉我有一些方法可以实现这一点,而不必在每次更改我的模板化接口(interface)时更新每个继承类的 using 指令列表!

我是否必须求助于使用与接口(interface)一起定义的指令的预处理器定义?啊啊啊!

最佳答案

这个说法是错误的:

... would have to list in the class definition every method that I wanted to inherit but not override, in order to let me later call it without something messy like alist::ISet->isEmpty():

尝试编译以下代码:

template<class T>
class Base {
public:
   virtual void f1();
   virtual void f2();
};

template<class T>
class Derived : public Base<T> {
public:
   virtual void f1();
};

void foobar()
{
   Derived<int> d;
   d.f1();
   d.f2();
}

如果你的意思是你想访问派生类的基类方法或成员,你可以简单地做更明确的方式:

template<class T>
class Derived : public Base<T> {
public:
   virtual void f1() { this->f2(); }
};

这并不困惑,可以按照您的要求工作,只是更明确一点(有人说始终明确使用 this-> 是个好主意)。

关于c++ - 在 C++ 的模板化子类中继承模板化基类方法而不列出每个方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19012397/

相关文章:

c++ - 检测键盘/条形码扫描仪事件的来源

c++ - 如何判断 bjam 正在使用哪些优化来构建 boost

C++ 可变参数模板空包

C++ 自定义单例

java - 如何将 Class<后代> 传递到 Hashmap 中?

c++ - 试图为从类继承的子类编写构造函数,猜测语法,预期主表达式错误?

c++ - 我如何将控制映射到它的设备?

c++ - 用特定字符终止循环

c++ - 具有类型特征的通用 lambda

java - 我应该如何在子类中定义这些生物?