C ++: ливается из const vector & lt; Derived * & gt; to const vector & lt; Base * & gt; безопасно? [Дубликат]

Вот некоторые подходы к работе с асинхронными запросами:
  1. Объект обезьяны браузера
  2. Q - A
  3. A + Promises.js
  4. jQuery отложен
  5. API XMLHttpRequest
  6. Использование концепции обратного вызова - как реализация в первом ответе

Пример: jQuery отложенная реализация для работы с несколькими запросами

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();
13
задан Carlton 7 April 2015 в 14:52
поделиться

3 ответа

Это потому, что, хотя 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());
20
ответ дан Barry 4 September 2018 в 09:05
поделиться

push_back выполняет поэтапные преобразования. Оператор присваивания существует только между векторами того же типа.

Легким решением является использование assign:

v2.assign(v1.begin(), v1.end());
9
ответ дан Kerrek SB 4 September 2018 в 09:05
поделиться

В общем случае шаблонов, если у вас есть шаблон шаблона

template <typename T> struct Foo {};

Foo<Base>, не является базовым классом Foo<Derived>.

Следовательно, вы не можете do:

Foo<Derived> f1;
Foo<Base> f2 = f1;
2
ответ дан R Sahu 4 September 2018 в 09:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: