2009-08-19 25 views
13

¿Podemos escribir palabras clave abstractas en la clase C++?¿Puedo usar la palabra clave `abstracta` en la clase C++

+23

Claro, podemos hacerlo. Lamentablemente, el código no se compilará, aunque =) – SadSido

+0

¿Qué pasa con la palabra clave abstracta en Visual C++ (específica de Micrsoft). No es estándar, o está bien implementado en mi opinión, pero cuenta, ¿verdad? : P – user965369

+0

Además de las funciones virtuales puras en C++, marco las clases abstractas con un "A_" como prefijo de nombre de clase en cualquier idioma, p. Ej. "A_MyAbstractClass". Personalmente encuentro esto bastante útil. –

Respuesta

17

No, C++ no tiene ninguna palabra clave abstracta. Sin embargo, puede escribir pure virtual functions; esa es la forma C++ de expresar clases abstractas.

35

No.

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

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

Cualquier clase que tiene al menos uno de ellos se considera abstracto.

+3

Falta el tipo de devolución. Además, el método debe ser virtual. – Naveen

+1

Absolutamente correcto, gracias. Hombre, tengo que salir del mantenimiento del código y escribir código nuevo de vez en cuando; disuelve tu cerebro solo mirando los errores de otras personas. :-D – DevSolar

5

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

+4

... que no es C++. En serio, ref, eso es invasión ... – DevSolar

+5

Técnicamente, es una extensión de Microsoft C++ para el código nativo, incluso si no se dirige a .NET, por lo que no es específico de C++/CLI. Solo una extensión, igual que '__interface' o' __declspec (property) '. Todavía no es ISO C++, por supuesto. –

+1

Sin downvotes pero C++ implica C++ estándar. Cualquier implementación XYZ no estándar debe especificarse explícitamente y hasta que se haya realizado tal especificación, no hay razón para reconocer su existencia. – lorefnon

4

no, debe tener al menos una función virtual pura en una clase para que sea abstracta.

Aquí es una buena referencia cplusplus.com

40
#define abstract 
0

No hay palabras clave 'abstracto' sino una función virtual pura se convierte en una clase a clase abstracta que se puede extender y re uso como una interfaz.

1

Como otros señalan, 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 parece útil hacer que el constructor esté protegido. De esta manera, obligas al usuario a subclasificar el ABC para usarlo.

Ejemplo:

class Base 
{ 
protected: 
    Base() 
    { 
    } 

public: 
    void foo() 
    { 
    } 

    void bar() 
    { 
    } 
}; 

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

realmente palabra clave abstract existe en C++ (VS2010 al menos) y me pareció que se puede utilizar para declarar una clase/struct como no instanciado.

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

+0

'abstract' no es parte del estándar C++. – smerlin

+0

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

+0

@cz ¿Qué logra '#define abstract'? –

0

no No se puede utilizar abstracto como una palabra clave .because allí no hay ninguna palabra clave resumen disponible en C++.

si desea hacer una clase como un resumen en C++, puede declarar al menos una función como pura función virtual.

pero en la clase derivada debe proporcionar la definición else da error de compilación.

EX:

class A 
{ 

public : 

    virtual void sum()=0; 

}; 

nota:

que puede utilizarse abstracto como un nombre de variable, nombre de la clase debido a lo anteriormente dicho que resumen no es una palabra clave en C++.

0

No, C++ no tiene palabra clave abstracta. Sin embargo, puede 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 .NET Framework. no, necesitas tener al menos una función virtual pura en una clase para que sea abstracta.

clase SomeClass { public: virtual void pure_virtual() = 0; // una función virtual pura

};

Cuestiones relacionadas