在 Java 中,容器有一个详细的通用类层次结构。 Java定义了类似ICollection
但是,使用 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
template<typename T>
class List : public ISet<T>
{
public:
...
void add(T e)
{
...
}
virtual sz size()
{
...
}
using ISet<T>::isEmpty; //well this is annoying
};
我理解其中的原因,并且“为什么它没有按我预期的方式工作?”这些问题已得到解答:here和 here .
我的问题是,是否有一种干净(甚至是任何!)的方法来实现这一点,而不必显式列出每个基类中继承但未覆盖的方法?
我真正想要的是可以放入 List
using ISet<T>::*;
这将使 ISet
请告诉我有一些方法可以实现这一点,而不必在每次更改我的模板化接口(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/