¿Cómo se declara una interfaz en C++?

Resuelto Aaron Fischer asked hace 15 años • 17 respuestas

¿Cómo configuro una clase que representa una interfaz? ¿Es esto sólo una clase base abstracta?

Aaron Fischer avatar Nov 25 '08 23:11 Aaron Fischer
Aceptado

Para ampliar la respuesta de bradtgmurray , es posible que desee hacer una excepción a la lista de métodos virtuales puros de su interfaz agregando un destructor virtual. Esto le permite pasar la propiedad del puntero a otra parte sin exponer la clase derivada concreta. El destructor no tiene que hacer nada porque la interfaz no tiene miembros concretos. Puede parecer contradictorio definir una función como virtual e integrada, pero créanme, no lo es.

class IDemo
{
    public:
        virtual ~IDemo() {}
        virtual void OverrideMe() = 0;
};

class Parent
{
    public:
        virtual ~Parent();
};

class Child : public Parent, public IDemo
{
    public:
        virtual void OverrideMe()
        {
            //do stuff
        }
};

No es necesario incluir un cuerpo para el destructor virtual; resulta que algunos compiladores tienen problemas para optimizar un destructor vacío y es mejor que utilices el predeterminado.

Mark Ransom avatar Nov 25 '2008 17:11 Mark Ransom

Crea una clase con métodos virtuales puros. Utilice la interfaz creando otra clase que anule esos métodos virtuales.

Un método virtual puro es un método de clase que se define como virtual y se asigna a 0.

class IDemo
{
    public:
        virtual ~IDemo() {}
        virtual void OverrideMe() = 0;
};

class Child : public IDemo
{
    public:
        virtual void OverrideMe()
        {
            // do stuff
        }
};
bradtgmurray avatar Nov 25 '2008 16:11 bradtgmurray

La única razón por la que tiene una categoría de tipo de interfaz especial además de las clases base abstractas en C#/ Java es porque C#/Java no admite herencia múltiple.

C++ admite herencia múltiple, por lo que no se necesita un tipo especial. Una clase base abstracta sin métodos no abstractos (virtuales puros) es funcionalmente equivalente a una interfaz C#/Java.

Joel Coehoorn avatar Nov 25 '2008 17:11 Joel Coehoorn