【发布时间】:2018-03-30 22:41:35
【问题描述】:
这是我的情况:
template <typename T>
struct Foo
{
Foo() {}
Foo(T data) : _data(data) {}
T _data;
};
struct Holder
{
Holder() {}
Holder(int a) : foo(a) {}
virtual Foo<int> getFoo() { return foo; }
virtual std::string type() { return "holder"; } // EDIT 2 EDIT 3: added virtual
Foo<int> foo;
};
struct HolderInt : public Holder
{
HolderInt() {}
HolderInt(int a) : Holder(a) {}
std::string type() { return "holderint"; } // EDIT 2
};
struct HolderString : public Holder
{
HolderString() {}
HolderString(std::string a) : Holder(0), foo(a) {}
Foo<std::string> getFoo() { return foo; } // here is the dilema
std::string type() { return "holderstring"; } // EDIT 2
Foo<std::string> foo;
};
int main()
{
std::vector<Holder*> holders;
holders.push_back(new HolderString());
return 0;
}
我正在寻找一种方法来实现这一点。我希望让它发挥作用的方式是维护一个单一的吸气剂,但如果我错过了一些对我的情况非常有用的东西,那就太好了。
编辑:我知道虚函数不能有不同的返回类型,但我正在寻找另一种选择。很抱歉之前没有这么说。
编辑 2:在进一步查看我的代码后,我意识到我错过了一些重要的东西。可以这么说,我有一个“to string”函数,我将在其中进行编辑。这可以帮助我区分每种结构类型,即使它们具有相同的 foo。我不知道在我查看了一段时间之前我怎么没有看到这个,但是我能够使用那个虚拟函数来解决这个问题。
【问题讨论】:
-
你错过了一个函数只能返回一个类型的事实;你有两个不同的 getter 返回两个不同的类型,一个
Foo<std::string>和一个Foo<int>。无论你想出什么 getter,它总是返回相同的类型。 -
这永远行不通。
Foo<int>和Foo<string>不是协变类型,不能仅根据返回类型重载方法。 -
您的示例缺少一个关键部分:用例。请用
holders[i]展示你会做什么。
标签: c++ polymorphism virtual