0

我编写了一个抽象类A

是否有可能创建一个虚函数value(),它将返回“任何”,当我们创建派生类时,B在此处实现函数value()并从中返回任何内容?

这是一个示例和对我的意图的解释:

class A {
    public virtual void value() = 0;
};

template < class T >
class B : public A {
    private T content;
    public T value() { return content; };
};

如您所见,我正在尝试创建一个通用容器,特别是在这种情况下可以使用它:

std::vector< A > container;
B< int > bint;
B< std::string > bstring;
B< zoo::monkey > bmonkey;
container.push_back( bint);
container.push_back( bstring );
container.push_back( bmonkey );

是否有解决方案或有其他更好的解决方案?

先感谢您。

4

2 回答 2

1

你仍然可以查看 boost::any 或 boost::variant

于 2013-06-13T14:32:57.570 回答
1

覆盖的返回类型必须与基类函数的返回类型共变。

编译器可以将协变类型“替换”为另一种类型。这对您来说意味着基类需要返回一些东西,而覆盖必须返回一些可转换为它的东西。

在您的情况下,您是void从基类返回的,除了void与 - 协变之外什么都没有void- 因此,正如所写的那样,只能void从派生类方法返回 a 。

由于您正在尝试编写一个可用于在容器中存储“任何东西”的通用类,我建议您查看Boost.VariantBoost.Any。从头开始编写一个变体类型的类非常困难,而且是一个已经被发明出来的轮子。

于 2013-06-13T14:45:22.887 回答