Как назначить unique_ptr <base>из объекта множественного наследования класса? - PullRequest
0 голосов
/ 21 апреля 2019

У меня есть этот код, я пытаюсь назначить unique_ptr базового класса из объекта множественного наследования класса. Я получил ошибку компиляции ниже:

‘std::unique_ptr<I>’ and ‘std::_MakeUniq<C>::__single_object {aka
std::unique_ptr<C, std::default_delete<C> >}’)    a =
make_unique<C>();
     ^ ```

Можно ли сделать это таким образом?

#include <memory>     

class I {
};

class A : public I {
};

class B : public I {
};

class C : virtual public A, virtual public B {
};

using namespace std;

int main() {
    unique_ptr<I> a;
    a = make_unique<C>();
}

1 Ответ

3 голосов
/ 21 апреля 2019

Проблема в том, что дерево наследования испорчено. Если вы собираетесь использовать множественное виртуальное наследование от I в C, то и A, и B должны его виртуально наследовать, в противном случае C приведет к двум I подобъектам, вызывающим проблемы преобразования:

class A : public  virtual I {
};

class B : public virtual I {
};
...