С++ реализует унаследованные абстрактные функции через унаследованные функции

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; }
};
2 ответа

В вашем фактическом коде ни один класс не реализует чистый виртуальный метод BuildRankTR. Следовательно, каждый класс в этой иерархии считается абстрактным.


Извините, ребята, теперь я знаю, где проблема.

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

licensed under cc by-sa 3.0 with attribution.