LittleBuster
@LittleBuster

Наследование интерфейсов С++?

Помогите, пожалуйста, разобраться как правильно унаследовать интерфейс от другого класса к интерфейсу нового класса, чтоб новый интерфейс знал функции и родителя и потомка, но компилятор не выдавал бы ошибок "Нельзя вызвать конструктор абстрактного класса Server" или ошибок типа "У класса нет такого метода".
Пробовал создать некий новый интерфейс class IMainServer: public IServer, public ITcpSocket но тогда go() выдаёт ошибки о невозможности конвертации Server к нему.

#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 Server: public IServer, public TcpSocket
{
public:
    void load(void)
    {
        cout << "load" << endl;
    }
};


void go(shared_ptr<IServer> server)
{
    server->start();
    server->load();
}

int main()
{
    auto server = make_shared<Server>();
    go(server);

    return 0;
}
  • Вопрос задан
  • 403 просмотра
Решения вопроса 1
@MiiNiPaa
Так у вас же ромбовидное наследование.

TcpSocket::ITcpSocket::start определено, а IServer::ITcpSocket::start — нет.

Вот и проблемы. Можно их решить, наследуясь от интерфейсов виртуально.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
petermzg
@petermzg
Самый лучший программист
Так компилятор прав. Нельзя создать инстанс абстрактного класса.
Определите все методы, что есть в интерфейсе и все заработает.
class TcpSocket: public ITcpSocket
{
public:
    void start(void)
    {
        cout << "start" << endl;
    }
   void load(void)
   {
   }
};
Ответ написан
@res2001
Developer, ex-admin
В go() передается указатель на IServer, а в iServer нет метода start.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы