Не могу скомпилировать мою программу. По историческим причинам у меня есть немного «сложная» иерархия классов в моем приложении. И теперь я столкнулся с другой проблемой: он не будет компилироваться из-за этой иерархии. Мой проект слишком велик, чтобы показать его здесь, но ниже вы можете увидеть пример, демонстрирующий проблему. Есть ли простой и элегантный способ это исправить? Каждый интерфейс / класс имеет действительно большое количество методов. Заранее спасибо.
struct ITest
{
virtual ~ITest() {}
virtual void a() = 0;
// and many other methods
};
struct Test1 : public ITest
{
virtual ~Test1() {}
virtual void a() override {}
// and many other methods overrides from ITest
// plus a lot of other logic
};
struct ExtendedTest1 : public Test1
{
virtual ~ExtendedTest1() {}
// a lot of some other stuff
};
struct ITest2 : public ITest
{
virtual ~ITest2(){}
// and big count of the its methods and logic
};
struct MainClass : public ExtendedTest1, public ITest2
{
virtual ~MainClass(){}
// a lot of logic
};
int main()
{
MainClass mainClassObj;
return 0;
}
И ошибки:
main.cpp: In function ‘int main()’:
main.cpp:36:15: error: cannot declare variable ‘mainClassObj’ to be of abstract type ‘MainClass’
MainClass mainClassObj;
^~~~~~~~~~~~
main.cpp:28:8: note: because the following virtual functions are pure within ‘MainClass’:
struct MainClass : public ExtendedTest1, public ITest2
^~~~~~~~~
main.cpp:4:18: note: virtual void ITest::a()
virtual void a() = 0;
^
Не судите строго:)
UPD: перед тем, как задать этот вопрос, я действительно пробовал виртуальное наследование длярешить мою проблему, но это не сработало. Итак, после предложения попробовать еще раз, это работает) Итак, замена этих строк решила мою проблему:
struct Test1 : public ITest ---> struct Test1 : virtual public ITest
struct ITest2 : public ITest ---> struct ITest2 : virtual public ITest
Я знаю, мы должны избежать виртуального наследования, но мы не можем, потому что по исторической причине и оченьбольшое количество кода
Спасибо всем за помощь!