Подтвердить что ты не робот

Эквивалент интерфейсов Java в С++?

Возможный дубликат:
Как вы объявляете интерфейс на С++? Интерфейс как в java в С++?

Я программист Java, изучающий С++, и мне было интересно, есть ли что-то вроде Java-интерфейсов в С++, то есть классы, которые другой класс может реализовать/расширить более одного. Благодарю. постскриптум Здесь, вот так скажите, если я сделал что-то не так.

4b9b3361

Ответ 1

В С++ класс, содержащий только чистые виртуальные методы, обозначает интерфейс.

Пример:

// Define the Serializable interface.
class Serializable {
     // virtual destructor is required if the object may
     // be deleted through a pointer to Serializable
    virtual ~Serializable() {}

    virtual std::string serialize() const = 0;
};

// Implements the Serializable interface
class MyClass : public MyBaseClass, public virtual Serializable {
    virtual std::string serialize() const { 
        // Implementation goes here.
    }
};

Ответ 2

Чтобы эмулировать Java interface, вы можете использовать обычную базу только с чистыми виртуальными функциями.

Вам нужно использовать виртуальное наследование, иначе вы можете получить повторное наследование: тот же класс может быть базовым классом более одного раза в С++. Это означает, что доступ этого базового класса в этом случае был бы неоднозначным.

С++ делает не предоставление точного эквивалента Java interface: в С++ переопределение виртуальной функции может выполняться только в производном классе класса с объявлением виртуальной функции, тогда как в Java, переопределитель для метода в interface может быть объявлен в базовом классе.

[Пример:

struct B1 {
    void foo ();
};

struct B2 {
    virtual void foo () = 0;
};

struct D : B1, B2 {
    // no declaration of foo() here
};

D наследует также объявления функций: B1::foo() и B2::foo().

B2::foo() является чисто виртуальным, поэтому D::B2::foo() тоже; B1::foo() не переопределяет B2::foo(), потому что B2 не является производным классом B1.

Таким образом, D является абстрактным классом.

- конец примера]

Во всяком случае, , почему вы эмулируете произвольные пределы Java в С++?

EDIT: добавлен пример для пояснения.