как реализовать интерфейсы на C ++?

Возможный дубликат:
Предпочтительный способ моделирования интерфейсов в C ++

Мне было любопытно узнать, есть ли интерфейсы в C ++, потому что в Java есть реализация шаблонов проектирования в основном с разделением классов через интерфейсы. Есть ли тогда аналогичный способ создания интерфейсов на C ++?


person helpdesk    schedule 18.03.2012    source источник
comment
Также дубликат stackoverflow .com / questions / 318064 /   -  person StayOnTarget    schedule 06.06.2018
comment
Вам действительно нужны интерфейсы? C++ имеет обширную поддержку шаблонов. Просто напишите свои функции, получающие шаблоны, и убедитесь, что переданные типы имеют требуемые методы, чтобы не вызывать ошибок компиляции, чтобы вы не навязывали своим пользователям наследование от чего-либо для использования ваших методов.   -  person Peregring-lk    schedule 01.10.2019


Ответы (3)


В C ++ нет встроенных концепций интерфейсов. Вы можете реализовать это, используя абстрактные классы, которые содержат только чистые виртуальные функции. Поскольку он допускает множественное наследование, вы можете унаследовать этот класс, чтобы создать другой класс, который затем будет содержать в себе этот интерфейс (я имею в виду интерфейс объекта :)).

Примером может быть что-то вроде этого -

class Interface
{
public:
    Interface(){}
    virtual ~Interface(){}
    virtual void method1() = 0;    // "= 0" part makes this method pure virtual, and
                                   // also makes this class abstract.
    virtual void method2() = 0;
};

class Concrete : public Interface
{
private:
    int myMember;

public:
    Concrete(){}
    ~Concrete(){}
    void method1();
    void method2();
};

// Provide implementation for the first method
void Concrete::method1()
{
    // Your implementation
}

// Provide implementation for the second method
void Concrete::method2()
{
    // Your implementation
}

int main(void)
{
    Interface *f = new Concrete();

    f->method1();
    f->method2();

    delete f;

    return 0;
}
person MD Sayem Ahmed    schedule 18.03.2012
comment
Ваш пример имеет неопределенное поведение, потому что в интерфейсе нет виртуального деструктора. - person CB Bailey; 18.03.2012
comment
@CharlesBailey: Извините, я забыл об этом упомянуть. Спасибо, что заметили это! Теперь нормально? - person MD Sayem Ahmed; 18.03.2012
comment
... хотя ваш пример также не должен компилироваться, потому что вы определяете Concrete :: method1 и Concrete :: method2, но они не являются допустимыми членами Concrete и you.instantiate Concrete, хотя он все еще является абстрактным. - person CB Bailey; 18.03.2012
comment
@CharlesBailey: Надеюсь, теперь все в порядке ... - person MD Sayem Ahmed; 18.03.2012
comment
Теперь мне кажется, что это нормально. Он компилируется, и valgrind не сообщает об ошибках. Какой компилятор вы использовали? - person CB Bailey; 18.03.2012
comment
@CharlesBailey: Ну, я не использовал компилятор, записал его по памяти .... наверное поэтому я столько всего пропустил ... - person MD Sayem Ahmed; 18.03.2012
comment
Приходите 2018, все еще нет базовой системы интерфейсов в C ++, черт возьми, я ненавижу, что у меня нет другого выбора, кроме C ++ - person fdsfdsfdsfds; 29.03.2018
comment
не было бы чище использовать ключевое слово override вместо =0? - person Lars Nielsen; 29.08.2018
comment
@fdsfdsfdsfds В C ++ есть интерфейсы. В C ++ нет ключевого слова interface. - person Caleth; 18.04.2019

Интерфейс - это не что иное, как чистый абстрактный класс в C ++. В идеале этот интерфейс class должен содержать только чистые virtual общедоступные методы и static const данные. Например:

class InterfaceA
{
public:
  static const int X = 10;

  virtual void Foo() = 0;
  virtual int Get() const = 0;
  virtual inline ~InterfaceA() = 0;
};
InterfaceA::~InterfaceA () {}
person iammilind    schedule 18.03.2012
comment
А как насчет виртуального деструктора? - person CB Bailey; 18.03.2012
comment
Я бы добавил виртуальный dtor, чтобы избежать возможных утечек памяти в будущем. - person barankin; 18.03.2012
comment
@CharlesBailey, пропустил это. Отредактировал пост. Добавлен в чистом виде virtual, чтобы сохранить чистую abstract сущность класса, и inline, чтобы он мог находиться в файле заголовка без ошибок компоновщика. - person iammilind; 18.03.2012
comment
Было бы проще определить деструктор в определении класса. Вы могли бы просто сделать virtual ~interfaceA() {}. Ваш класс уже является абстрактным, поэтому вы ничего не получите, сделав деструктор чистой виртуальной функцией. - person CB Bailey; 18.03.2012
comment
@barankin: Утечки памяти не имеют ничего общего с виртуальными деструкторами. Речь идет просто о написании правильного C ++. - person Kerrek SB; 18.03.2012

В C ++ нет концепции интерфейса,
Вы можете смоделировать поведение, используя Абстрактный класс.
Абстрактный класс - это класс, который имеет по крайней мере одну чистую виртуальную функцию. Нельзя создавать какие-либо экземпляры абстрактного класса, но вы можете создавать указатели и ссылки на него . Также каждый класс, унаследованный от абстрактного класса, должен реализовывать чистые виртуальные функции, чтобы его экземпляры могли быть созданы.

person Alok Save    schedule 18.03.2012