Как использовать в множественном наследовании абстрактный метод - PullRequest
0 голосов
/ 04 февраля 2019

Похоже, что есть что-то, чего я не понимаю в множественном наследовании и абстрактных методах.Я реализую некоторые аппаратные функции в SystemC с несколькими целевыми HW.У меня есть два разных уровня реализации программного обеспечения.Первый оптимизирован для производительности;второй наверху имеет некоторые функции отображения и т. д.[Обратите внимание, что в мире аппаратного обеспечения «верхний» относится к экземпляру самого высокого уровня, который обычно является оберткой или тестовым окружением для аппаратного экземпляра]

Чтобы фактически обработать HW, в scSW я реализовал «Hold ()»,Когда я хочу использовать его на более высоком уровне (см. SW и SW2), мой компилятор сказал

error: ‘scHW’ is an ambiguous base of ‘SW’
 struct SW : scSW, HW { virtual bool Holds(){return scHW::Holds();} };

и

invalid new-expression of abstract class type ‘SW2’
     SW2* S2 = new SW2;
                   ^~~
because the following virtual functions are pure within ‘SW2’:
 struct SW2 : scSW, HW {  };

Он также добавил:

 request for member ‘Holds’ is ambiguous
     std::cerr << S2->Holds();

Я особенно не понимаю, как метод может быть чистым и неоднозначным одновременно?Что я не так и как правильно кодировать то, что я хочу?

#include <iostream>
struct Virtual { virtual bool Holds() = 0;};
struct scHW { bool Holds(){return true;}};
struct scSW : scHW, Virtual {};
struct HW : scHW { };
struct HW2 : scHW { virtual bool Holds(){return scHW::Holds();}};
struct SW : scSW, HW { virtual bool Holds(){return scHW::Holds();} };
struct SW2 : scSW, HW {  };

int main()
{
    HW* H = new HW;
    HW2* H2 = new HW2;
    scHW* H1 = new scHW;
    SW* S = new SW;
    SW2* S2 = new SW2;
    std::cerr << S->Holds();
    std::cerr << H->Holds();
    std::cerr << H2->Holds();
    std::cerr << S2->Holds();
}

Ответы [ 2 ]

0 голосов
/ 04 февраля 2019

Похоже, что вам может не потребоваться множественное наследование, и просто сделайте:

 struct scHW : Virtual { virtual bool Holds(){return true;}};
 struct scSW : scHW {};
 ...

таким образом scHW не является абстрактным и может быть реализовано.

0 голосов
/ 04 февраля 2019

Это чисто и неоднозначно в то же время, потому что поиск имени и переопределение виртуальной функции - это в основном ортогональные механизмы.Вы видите здесь:

struct scSW : scHW, Virtual {};
struct HW : scHW { };

Поиск Holds в scSW перейдет в два различных подобъекта базового класса (, как объяснялось в предыдущем вопросе ).Основания scHW и Virtual.Таким образом, поиск неоднозначен.Это две разные функции в двух разных классах, на которые ссылается один и тот же идентификатор.

Что не совсем случайно также, почему Virtual::Holds не переопределяется в scSW.Член от scHW не имеет отношения.В scSW нет переопределения виртуальной функции, поэтому класс остается абстрактным.

...