Наследование интерфейсов С++? Помогите, пожалуйста, разобраться как правильно унаследовать интерфейс от другого класса к интерфейсу нового класса, чтоб новый интерфейс знал функции и родителя и потомка, но компилятор не выдавал бы ошибок "Нельзя вызвать конструктор абстрактного класса 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 server) { server->start(); server->load(); } int main() { auto server = make_shared(); go(server); return 0; }
Проблема в вашем коде заключается в том, что вы пытаетесь унаследовать класс 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. Ошибки компиляции быть не должно, и программа должна успешно скомпилироваться и запуститься.
Проблема в вашем коде заключается в том, что вы пытаетесь унаследовать класс 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. Ошибки компиляции быть не должно, и программа должна успешно скомпилироваться и запуститься.