Наследование интерфейсов С++? Помогите, пожалуйста, разобраться как правильно унаследовать интерфейс от другого класса к интерфейсу нового класса, чтоб новый интерфейс знал функции и родителя и потомка, но компилятор не выдавал бы ошибок "Нельзя вызвать конструктор абстрактного класса Server" или ошибок типа "У класса нет такого метода".
Пробовал создать некий новый интерфейс class IMainServer: public IServer, public ITcpSocket но тогда go() выдаёт ошибки о невозможности конвертации Server к нему.#include
#include
using namespace std;
/* Interfaces */
class ITcpSocket
{
public:
virtual void start(void) = 0;
};
class IServer: public ITcpSocket
{
public:
virtual void load(void) = 0;
};
/* Classes */
class TcpSocket: public ITcpSocket
{
public:
void start(void)
{
cout << "start" << endl;
}
};
class Server: public IServer, public TcpSocket
{
public:
void load(void)
{
cout << "load" << endl;
}
};
void go(shared_ptr server)
{
server->start();
server->load();
}
int main()
{
auto server = make_shared();
go(server);
return 0;
}

21 Авг 2019 в 07:05
288 +2
0
Ответы
1

Проблема в вашем коде заключается в том, что вы пытаетесь унаследовать класс Server как от интерфейса IServer, так и от класса TcpSocket, который уже содержит реализацию метода start.

Чтобы избежать ошибок компиляции, можно унаследовать класс Server только от интерфейса IServer, а саму реализацию метода start переместить в другой класс, например, TcpServer. Вот пример исправленного кода:

#include <memory>
#include <iostream>
using namespace std;
/* Interfaces */
class ITcpSocket
{
public:
virtual void start(void) = 0;
};
class IServer: public ITcpSocket
{
public:
virtual void load(void) = 0;
};
/* Classes */
class TcpSocket: public ITcpSocket
{
public:
void start(void)
{
cout << "start" << endl;
}
};
class TcpServer: public IServer
{
public:
void start(void)
{
cout << "start" << endl;
}
void load(void)
{
cout << "load" << endl;
}
};
void go(shared_ptr<IServer> server)
{
server->start();
server->load();
}
int main()
{
auto server = make_shared<TcpServer>();
go(server);
return 0;
}

Теперь класс Server унаследован только от интерфейса IServer, и метод start реализован в классе TcpServer. Ошибки компиляции быть не должно, и программа должна успешно скомпилироваться и запуститься.

20 Апр 2024 в 13:07
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Гарантированные бесплатные доработки в течение 1 года
Быстрое выполнение от 2 часов
Проверка работы на плагиат
Поможем написать учебную работу
Прямой эфир