var App = App || {};
App = {
getDataFromServer: function(){
var self = this,
deferred = $.Deferred(),
requests = [];
requests.push($.getJSON('request/ajax/url/1'));
requests.push($.getJSON('request/ajax/url/2'));
$.when.apply(jQuery, requests).done(function(xhrResponse) {
return deferred.resolve(xhrResponse.result);
});
return deferred;
},
init: function(){
this.getDataFromServer().done(_.bind(function(resp1, resp2) {
// Do the operations which you wanted to do when you
// get a response from Ajax, for example, log response.
}, this));
}
};
App.init();
Это потому, что, хотя Base
и Derived
имеют отношение, между vector<Base*>
и vector<Derived*>
нет отношения. Что касается иерархии классов, то они полностью не связаны друг с другом, поэтому вы не можете назначить их другим.
Концепция, которую вы ищете, называется ковариацией . Например, в Java String[]
является подтипом Object[]
. Но в C ++ эти два типа являются только разными типами и не более связаны с String[]
и Bar
.
push_back
работает, потому что этот метод просто принимает значение T const&
(или T&&
), поэтому все, что может быть конвертировано в Base*
, будет приемлемым - это Derived*
.
Тем не менее, vector
имеет конструктор, который принимает пару итераторов, которые должны быть проще использовать здесь:
vector<Base*> v2(v1.begin(), v1.end());
Или, поскольку он уже построен:
v2.assign(v1.begin(), v1.end());
push_back
выполняет поэтапные преобразования. Оператор присваивания существует только между векторами того же типа.
Легким решением является использование assign
:
v2.assign(v1.begin(), v1.end());
В общем случае шаблонов, если у вас есть шаблон шаблона
template <typename T> struct Foo {};
Foo<Base>
, не является базовым классом Foo<Derived>
.
Следовательно, вы не можете do:
Foo<Derived> f1;
Foo<Base> f2 = f1;