¿Puedo usar la palabra clave `abstract` en la clase C++?

2 minutos de lectura

¿Podemos escribir una palabra clave abstracta en la clase C++?

  • Claro, podemos hacerlo. Desafortunadamente, el código no se compilará, aunque =)

    – SadSido

    19 de agosto de 2009 a las 10:27

  • ¿Qué pasa con la palabra clave abstracta en Visual C ++ (específico de Microsoft). No es estándar, o bien implementado en mi opinión, pero cuenta, ¿no? :PAG

    – usuario965369

    7 abr 2012 a las 20:26

  • Además de las funciones virtuales puras en C++, marco las clases abstractas con una “A_” como prefijo de nombre de clase en cualquier idioma, por ejemplo, “A_MyAbstractClass”. Personalmente encuentro esto bastante útil.

    – Martín Meeser

    18 de marzo de 2013 a las 11:58

#define abstract

  • Si bien es divertido, esto sería un en realidad mala idea…

    – DevSolar

    2 de octubre de 2021 a las 8:02

  • Hay muchos lugares para ser gracioso en Internet. Este no es uno de esos.

    – Arda

    14 dic 2022 a las 19:21

Avatar de usuario de DevSolar
DevSolar

No.

Las funciones virtuales puras, en C++, se declaran como:

class X
{
    public:
        virtual void foo() = 0;
};

Cualquier clase que tenga al menos uno de ellos se considera abstracta.

  • Falta el tipo de retorno. Además, el método debe ser virtual.

    – Naveen

    19 de agosto de 2009 a las 6:42

  • Absolutamente correcto, gracias. Hombre, tengo que sacar mi cabeza del mantenimiento del código y escribir código nuevo de vez en cuando: disuelve tu cerebro solo mirando los errores de otras personas. 😀

    – DevSolar

    19 de agosto de 2009 a las 9:10

No, C++ no tiene resumen de palabras clave. Sin embargo, puedes escribir funciones virtuales puras; esa es la forma C++ de expresar clases abstractas.

Es una palabra clave introducida como parte de la especificación del lenguaje C++/CLI para el marco .NET.

no, debe tener al menos una función virtual pura en una clase para ser abstracto.

Aquí hay una buena referencia. cplusplus.com

Como señalan otros, si agrega una función virtual pura, la clase se vuelve abstracta.

Sin embargo, si desea implementar una clase base abstracta sin miembros virtuales puros, me resulta útil proteger el constructor. De esta manera, obliga al usuario a subclasificar el ABC para usarlo.

Ejemplo:

class Base
{
protected:
    Base()
    {
    }

public:
    void foo()
    {
    }

    void bar()
    {
    }
};

class Child : public Base
{
public:
    Child()
    {
    }
};

en realidad palabra clave abstract existe en C ++ (VS2010 al menos) y descubrí que se puede usar para declarar una clase/estructura como no instanciada.

struct X abstract {
    static int a;
    static void foX(){};
};
int X::a = 0;
struct Y abstract : X { // something static
};
struct Z : X { // regular class
};
int main() {
    X::foX();
    Z Zobj;
    X Xobj;    // error C3622
}

MSDN: https://msdn.microsoft.com/en-us/library/b0z6b513%28v=vs.110%29.aspx

  • abstract no es parte del estándar C++.

    – smerlin

    03/02/2016 a las 23:10

  • No estándar, pero dado que es un control de cordura no funcional, se soluciona fácilmente con un condicional #define en otros compiladores según la respuesta de Ken.

    – cz

    31 de julio de 2016 a las 19:24

  • @cz ¿Qué hace #define abstract ¿lograr?

    – Stefan Stanković

    28 de diciembre de 2016 a las 17:24

¿Ha sido útil esta solución?