我正在为我的容器类派生一个基类,以便我可以维护一致的接口。目前,它看起来是这样的:具有不同数据类型的纯虚拟方法
template <typename Datatype>
class BaseClass
{
public:
virtual Datatype Foo() = 0;
virtual Datatype Bar() = 0;
};
template <typename Datatype>
class DerivedClass: public BaseClass<Datatype>
{
public:
virtual Datatype Foo()
{
}
virtual Datatype Bar()
{
}
};
不过,我的一些派生类,Foo()
和Bar()
可能需要具有彼此不同的返回类型。如果没有基类中每个不同返回类型的模板参数,我怎么能给派生类一些空间来改变这种事情呢?
编辑:
派生类使用的类型是可能完全不同的和不变的。实际上,派生类不保证除方法名称之外有任何共同点。
“派生类不保证有任何形式的方法名称以外的共同点” - 那么这是一个“一致的接口”,然后呢?如果我有一个'BaseClass * p',如果某些子类返回int并且其他返回'std :: string',我将如何以及为什么要调用'p-> Foo()'?尽管如此,你也许可以抛出Boost.Variant或Boost.Any。 –
2011-04-15 12:18:57
@Steve这个想法是我可以创建一个不关心数据类型的非朋友,非成员函数。例如,说一个将元素插入容器的函数。 – Maxpm 2011-04-15 12:36:45
不幸的是编译器需要“知道”返回类型来调用一个函数,即使你不使用结果。这是为了允许调用者提供堆栈空间来写结果的调用约定(并且据我所知,几乎所有事情都是这样做的)。因此,您可以在返回类型无关的情况下使用模板代码(因为编译器会在模板实例化时计算出来,但程序员不在意),但动态多态性不会以这种方式工作 - 调用虚拟函数需要返回类型对于所有覆盖都是相同的。 – 2011-04-15 12:43:10