我显然已经在 Java 领域停留太久了...是否有可能执行与以下 Java 代码等效的 C++:
interface Foo {}
class Bar implements Foo {}
static List<Foo> getFoo() {
return new LinkedList<Foo>();
}
static List<Bar> getBar() {
return new LinkedList<Bar>();
}
List<? extends Foo> stuff = getBar();
其中 Foo 是 Bar 的子类。
所以在 C++ 中....
std::list<Bar> * getBars()
{
std::list<Bar> * bars = new std::list<Bar>;
return bars;
}
std::list<Foo> * stuff = getBars();
希望这是有道理的....
最佳答案
改变
std::list<Bar> & getBars()
到
std::list<Bar> getBars()
这原则上会按值返回,但是有复制构造省略机制,所以优化编译器应该可以优化
std::list<Bar> bars (getBars());
不涉及复制构造函数,直接构建bars
。
此外,在 C++0x 中有移动构造函数,因此即使出于任何原因没有删除复制/移动,上述代码也是高效的。
编辑遗漏的子类问题:
一般来说,这在 C++ 中是不可能完全做到的(我假设 Foo
是 Bar
的父类(super class),否则呢你所做的毫无意义)。一些 reinterpret_cast
黑魔法可能是可行的,但我强烈建议不要这样做。
最接近的近似值可能是这样的(相应地调整了 getBars()
):
std::list <Bar*> bars (getBars ());
std::list <Foo*> foos (bars.begin (), bars.end ());
但是,这会给您带来一些不平凡的内存管理负担。使用某种自动指针可能会有所帮助,但据我所知,只有 shared_ptr
可以在容器中使用。
最后,Foo
/Bar
类层次结构应该使用虚函数,否则你想做的几乎肯定不会起作用(即除非你真的想忽略子类中的任何重写)。
关于C++ 泛型列表赋值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2744132/