Невозможно объявить переменную абстрактного типа, потому что виртуальные функции чистые - с множественным наследованием
Я видел несколько ответов на этот вид проблемы, но я не понимаю, как ее решить. Основная проблема, вероятно, в том, что я работаю над чужим кодом, но не так. Вот сокращенный пример для этой проблемы: у меня есть один класс, который связывает много других классов:
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
верно?) где-то, чтобы переменная не была абстрактного типа. Но мои знания на этом заканчиваются - и множественное наследование просто смущает меня.
1 ответ
Чистая виртуальная функция - это виртуальная функция, которая явно не имеет реализации (обозначается конечным= 0
). Чистая виртуальная функция предназначена для того, чтобы заставить производные классы предоставлять собственную реализацию для этой функции. Другими словами, ожидается, что производный класс в конечном итоге определит свое собственное поведение для этой функции.
Абстрактный класс - это класс, который имеет одну или несколько чистых виртуальных функций, потому что он объявляет хотя бы одну или наследуется от абстрактного класса и не переопределяет все унаследованные чистые виртуальные функции. Эти классы не могут быть созданы (вы не можете создать экземпляр этого), так как их поведение не полностью определено. Они могут использоваться только в качестве базовых классов для других типов.
В твоем случае,system_atoms
определяет 2 чисто виртуальные функции, так что это абстрактный класс. Каждый из перечисленных вами классов наследует отsystem_atoms
также абстрактен, поскольку все они наследуются от этих чисто виртуальных функций и никогда не переопределяют их.
Правильное решение - обеспечить реализацию этих чисто виртуальных функций в вашем производном классе путем переопределения.
Смотрите виртуальные функции иoverride
спецификатор.
Множественное наследование здесь не играет роли, за исключением того, что каждый унаследованный класс может иметь свои собственные чисто виртуальные функции. Просто переопределите чистые виртуальные функции как обычно.