Невозможно объявить переменную абстрактного типа, потому что виртуальные функции чистые — с множественным наследованием

Я видел несколько ответов на этот вид проблемы, но я не понимаю, как ее решить. Основная проблема, вероятно, в том, что я работаю над чужим кодом, но не так. Вот уменьшенный образец для этой проблемы:
У меня есть один класс, который связывает много других классов:

class Interface
: public system_atoms,
public system_io,
/* etc, others */
{
/* A few functions, none that matters here - none from the inherited classes redefined */
}

Внутри system_atoms у меня есть:

class system_atoms {
public:
virtual int init_atom(int atom_number) = 0;
virtual int check_atom_id(int atom_number) = 0;
}

И у меня есть класс, который должен наследовать от интерфейса:

class Interface_proxy : public Interface {
public:
/* stuff - no function from the inherited classes redefined */
}

В .cpp:

Interface_proxy global_interface_proxy;

Компиляция приносит ошибку с указанием «Невозможно объявить переменную global_interface_proxy быть абстрактного типа Interface_proxy потому что виртуальные функции [две из перечисленных в system_atoms] являются чистыми».

Я не очень опытный в C ++ либо. Я думаю, что я должен переопределить две виртуальные функции как чистые (то же самое без = 0 и virtual верно?) где-то, чтобы переменная не была абстрактного типа. Но мои знания на этом заканчиваются — и множественное наследование просто смущает меня.

0

Решение

чисто виртуальная функция это функция, которая является виртуальной и явно не имеет реализации (обозначается конечным = 0). Чистая виртуальная функция предназначена для того, чтобы заставить производные классы предоставлять собственную реализацию для этой функции. Другими словами, ожидается, что производный класс в конечном итоге определит свое собственное поведение для этой функции.

Абстрактный класс — это класс, который имеет одну или несколько чистых виртуальных функций, потому что он объявляет хотя бы одну или наследуется от абстрактного класса и не переопределяет все унаследованные чистые виртуальные функции. Эти классы не могут быть созданы (вы не можете создать экземпляр этого), так как их поведение не полностью определено. Они могут использоваться только в качестве базовых классов для других типов.

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

Правильное решение — обеспечить реализацию этих чисто виртуальных функций в вашем производном классе путем переопределения.

Увидеть виртуальные функции
и override спецификатор.

Множественное наследование здесь не играет роли, за исключением того, что каждый унаследованный класс может иметь свои собственные чисто виртуальные функции. Просто переопределите чистые виртуальные функции как обычно.

4

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]