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

0

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; }
};
  • 3
    Не могу воспроизвести. После добавления недостающего ; с определениями классов и делает функции членов public , TopClass t; t.work(); компилируется как с gcc 4.9.2, так и clang 3.5.0 с использованием -Wall -Wextra -pedantic -ansi-std=c++11 ).
  • 0
    Извините, код был составлен. Я добавил код, извлеченный непосредственно из проекта.
Теги:
inheritance
override
abstract-class
pure-virtual

2 ответа

1

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

  • 0
    Извините, это не проблема в моем исходном коде. Позвольте мне попытаться извлечь проблемную часть еще раз, на этот раз в меньшей спешке ... но спасибо.
0

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню