我有如下代码。我有一个抽象模板类 Foo 和两个子类(Foo1 和 Foo2),它们派生自模板的实例化。我希望在我的程序中使用可以指向 Foo1 或 Foo2 类型的对象的指针,因此我创建了一个接口(interface) IFoo。
我的问题是我不确定如何在界面中包含 functionB,因为它依赖于模板实例化。是否有可能通过接口(interface)访问 functionB,还是我在尝试不可能的事情?
非常感谢您的帮助。
class IFoo {
public:
virtual functionA()=0;
};
template<class T>
class Foo : public IFoo{
public:
functionA(){ do something; };
functionB(T arg){ do something; };
};
class Foo1 : public Foo<int>{
...
};
class Foo2 : public Foo<double>{
...
};
最佳答案
你实际上是在尝试不可能的事情。
问题的核心很简单:virtual
和 template
不能很好地混合。
template
是关于编译时代码生成的。您可以将其视为某种类型感知宏 + 一些用于元编程的小技巧。virtual
是关于运行时决策的,这需要一些工作。
virtual
通常使用虚拟表来实现(想象一个列出方法的表)。方法的数量需要在编译时知道,并在基类中定义。
但是,根据您的要求,我们需要一个无限大小的虚拟表,其中包含我们尚未见过的类型的方法,并且只会在未来几年内定义......很遗憾这是不可能的。
如果可能的话?
好吧,这没有任何意义。当我用 int
调用 Foo2
会发生什么?这不是为了它!因此它打破了Foo2
实现IFoo
中所有方法的原则。
所以,如果您陈述真正的问题会更好,这样我们可以在设计层面而不是技术层面为您提供帮助:)
关于c++ - 在 C++ 中为抽象类模板创建接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3251549/