Похоже, что есть что-то, чего я не понимаю в множественном наследовании и абстрактных методах.Я реализую некоторые аппаратные функции в 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();
}