SOLVED, проблема была чем-то другим, извините
Я пытаюсь реализовать классы, составляющие инструменты, работающие над интерфейсом следующим образом:
class Interface
{
bool virtual use() = 0;
}
class Tool : public virtual Interface
{
void work() { use(); }
}
class InterfaceImplementation : public virtual Interface
{
bool use() { return DoSomethingUseful(); }
}
class TopClass : public Tool, public InterfaceImplementation
{
/* whatever using work() */
}
Проблема в том, что TopClass утверждает, что является абстрактным. Как я вижу, инструмент является абстрактным из-за интерфейса, а абстрактные функции наследуются, это прекрасно. Функции, определенные внутри TopClass, теперь могут переопределять эти абстрактные функции и сделать TopClass нестойкой (что работает, если я пытаюсь), почему этого не происходит, вместо того, чтобы определять эти переопределяющие функции, я просто наследую их?
Я пробовал: играя с виртуальностью наследования и предками предков (в определении TopClass)
Только для записи: (практически неактуально) TopClass имеет несколько инструментов и интерфейс сложный, поэтому виртуальные наследования. Мне нужно использовать тот же интерфейс InterfaceImplementation (большой класс), для определения нескольких классов TopClass (каждый с разными инструментами), поэтому я не могу определить абстрактные функции внутри TopClass, как упоминалось выше. Проще говоря, мой дизайн имеет смысл, когда его можно увидеть полностью :)
Редактировать: код выше был составлен, вот фактический код, который не будет компилироваться. Это немного сложнее, но проблема заключается в том, что у BuildRank нет аэродрома в AIKBarnard.
struct KPlugExt
{
bool virtual plug() = 0;
};
struct KEvaluator : public virtual KPlugExt
{
virtual int BuildRank(Card card) = 0;
};
struct KBarnardEvaluator : public virtual KPlugExt
{
int virtual BuildRank(Card card);
};
struct KBarnardActions : public virtual KPlugExt, public virtual KEvaluator
{
/* stuff */
};
class AIKBarnard : public KBarnardActions, public KBarnardEvaluator
{
public:
bool plug() { return false; }
};
В вашем фактическом коде ни один класс не реализует чистый виртуальный метод BuildRankTR
. Следовательно, каждый класс в этой иерархии считается абстрактным.
Извините, ребята, теперь я знаю, где проблема.
Как вы можете видеть выше, для реализации одного из моих интерфейсов не было оригинального интерфейса в качестве предка, поэтому функции на самом деле не переопределялись, как и следовало ожидать. Из-за многих уровней между этими опубликованными классами ошибка потерялась в коде, и компилятор указывал на неправильное место в определениях.
;
с определениями классов и делает функции членовpublic
,TopClass t; t.work();
компилируется как с gcc 4.9.2, так и clang 3.5.0 с использованием-Wall -Wextra -pedantic -ansi
(и-std=c++11
).