2012-03-18 3 views
38

Можно создать дубликат:
Preferred way to simulate interfaces in C++Как реализовать интерфейсы в C++?

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

ответ

65

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

образец пример будет что-то вроде этого -

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

В вашем примере есть _undefined behavior_, потому что интерфейс не имеет виртуального деструктора. –

+0

@CharlesBailey: Извините, забыл упомянуть об этом. Спасибо, что поймали это! Теперь нормально? –

+2

... хотя ваш пример также не должен компилироваться, потому что вы определяете Concrete :: method1 и Concrete :: method2, но это недействительные члены Concrete и you.instantiate Concrete, хотя он еще абстрактный. –

12

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

7

Интерфейс - это только чистый абстрактный класс в 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() {} 
+1

Как насчет виртуального деструктора? –

+0

Я бы добавил виртуальный dtor, чтобы избежать возможных утечек памяти в будущем. – barankin

+0

@CharlesBailey, пропустил это. Отредактировано сообщение. Добавлен как чистый 'virtual' только для поддержания чистой абстрактности класса и' inline', чтобы он мог находиться в файле заголовка без ошибок компоновщика. – iammilind

Смежные вопросы