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

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

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

Ответы

Ответ 1

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;
}

Ответ 2

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

Ответ 3

Интерфейс - это не что иное, как чистый абстрактный класс в C++. В идеале этот интерфейсный class должен содержать только чистые virtual публичные методы и static const данные 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 () {}