Share via


Clase de Visual C++ en el Diseñador de clases

El Diseñador de clases admite las clases de C++ y visualiza las clases nativas de C++ del mismo modo que Visual Basic y las formas de clase de Visual C#, con la salvedad de que las clases de C++ pueden tener varias relaciones de herencia. Puede expandir la forma de clase para mostrar más campos y métodos de la clase, o contraerla para ahorrar espacio.

Nota

El Diseñador de clases no admite las uniones (un tipo especial de clase en el que la memoria asignada es solamente la cantidad necesaria para el miembro de datos más grande de la unión).

Herencia simple

Si se arrastra más de una clase a un diagrama de clase y las clases tienen una relación de herencia de clases, una flecha las conecta. La flecha apunta en la dirección de la clase base. Por ejemplo, cuando las clases siguientes se muestran en un diagrama de clase, una flecha las conecta, apuntando desde B hasta A:

class A {};
class B : A {};

También puede arrastrar únicamente la clase B hasta el diagrama de clase, hacer clic con el botón secundario en la forma de clase para B y, a continuación, hacer clic en Mostrar clases base. De esta forma, se muestra la clase base, es decir, A.

Herencia múltiple

El Diseñador de clases admite la visualización de relaciones de herencia múltiple de clases. La herencia múltiple se usa cuando una clase derivada presenta atributos de más de una clase base. A continuación, se muestra un ejemplo de herencia múltiple:

class Bird {};
class Swimmer {};
class Penguin : public Bird, public Swimmer {};

Si se arrastra más de una clase al diagrama de clase y las clases tienen una relación de herencia múltiple de clases, una flecha las conecta. La flecha apunta en la dirección de las clases base.

Al hacer clic con el botón secundario en una forma de clase y, a continuación, hacer clic en Mostrar clases base se muestran las clases base para la clase seleccionada.

Nota

El código de C++ no admite el comando Mostrar clases derivadas. Puede mostrar las clases derivadas yendo a Vista de clases, expandiendo el nodo de tipo, expandiendo la subcarpeta Tipos derivados y, a continuación, arrastrando esos tipos hasta el diagrama de clase.

Para obtener más información acerca de la herencia múltiple de clases, consulte Multiple Inheritance y Multiple Base Classes.

Clases abstractas

El Diseñador de clases admite clases abstractas (también denominadas "clases base abstractas"). Éstas son clases de las que nunca crea instancias, pero de las que puede derivar otras clases. Utilizando un ejemplo de "Herencia múltiple" mencionado anteriormente en este documento, puede crear instancias de la clase Bird como objetos individuales del modo siguiente:

int main()
{
   Bird sparrow;
   Bird crow;
   Bird eagle;
}

Sin embargo, no puede crear instancias de la clase Swimmer como objetos individuales. Sólo puede derivar otros tipos de clases de animales de ella, por ejemplo, Penguin, Whale y Fish. En ese caso, puede declarar la clase Swimmer como una clase base abstracta.

Para declarar una clase como abstracta, puede utilizar la palabra clave abstract. Los miembros que están marcados como abstractos o que se incluyen en una clase abstracta, son virtuales y deben ser implementados por clases derivadas de la clase abstracta.

class Swimmer abstract
{
   virtual void swim();
   void dive();
};

También puede declarar una clase como abstracta incluyendo al menos una función virtual pura:

class Swimmer
{
   virtual void swim() = 0;
   void dive();
};

Al mostrar estas declaraciones en un Diagrama de clase, el nombre de clase Swimmer y su función virtual pura swim aparecen en cursiva en una forma de clase abstracta, junto con la notación Clase abstracta. Observe que la forma del tipo de clase abstracta es la misma que la de una clase normal, excepto que su borde es una línea de puntos.

Una clase derivada de una clase base abstracta debe invalidar cada función virtual pura en la clase base o no se podrán crear instancias de la clase derivada. Por ejemplo, si deriva una clase Fish de la clase Swimmer, Fish debe invalidar el método swim:

class Fish : public Swimmer
{
   void swim(int speed);
};

int main()
{
   Fish guppy;
}

Al mostrar este código en un Diagrama de clase, el Diseñador de clases dibuja una línea de herencia de Fish en Swimmer.

Clases anónimas

El Diseñador de clases admite las clases anónimas. Los tipos de clases anónimas son clases declaradas sin identificador. No pueden tener ningún constructor ni destructor, no pueden pasarse como argumentos a funciones y no pueden devolverse como valores devueltos de funciones. Puede usar una clase anónima para reemplazar un nombre de clase por un nombre de definición de tipos, tal y como se muestra en el ejemplo siguiente:

typedef struct
{
    unsigned x;
    unsigned y;
} POINT;

Las estructuras también pueden ser anónimas. El Diseñador de clases muestra las clases y estructuras anónimas del mismo modo que muestra el tipo respectivo. Aunque puede declarar y mostrar clases y estructuras anónimas, el Diseñador de clases no usará el nombre de etiqueta que especifique. Usará el nombre generado por la Vista de clases. La clase o estructura se mostrará en la Vista de clases y en el Diseñador de clases como un elemento denominado __unnamed.

Para obtener más información acerca de las clases anónimas, consulte Anonymous Class Types.

Clases de plantillas

El Diseñador de clases admite la visualización de clases de plantillas. Se admiten declaraciones anidadas. En la tabla siguiente se muestran algunas declaraciones típicas.

Elemento de código

Vista Diseñador de clases

template <class T>

class A {};

A<T>

Clase de plantilla

template <class T, class U>

class A {};

A<T, U>

Clase de plantilla

template <class T, int i>

class A {};

A<T, i>

Clase de plantilla

template <class T, template <class K> class U>

class A {};

A<T, U>

Clase de plantilla

En la tabla siguiente se muestran algunos ejemplos de especialización parcial.

Elemento de código

Vista Diseñador de clases

template<class T, class U>

class A {};

A<T, U>

Clase de plantilla

template<class T>

class A<T, T> {};

A<T, T>

Clase de plantilla

template <class T>

class A<T, int> {};

A<T, int>

Clase de plantilla

template <class T1, class T2>

class A<T1*, T2*> {};

A<T1*, T2*>

Clase de plantilla

En la tabla siguiente se muestran algunos ejemplos de herencia en la especialización parcial.

Elemento de código

Vista Diseñador de clases

template <class T, class U>

class A {};

template <class TC>

class A<T, int> {};

class B : A<int, float>

{};

class C : A<int, int>

{};

A<T, U>

Clase de plantilla

B

Clase

(apunta a Clase A)

C

Clase

(apunta a Clase A)

En la tabla siguiente se muestran algunos ejemplos de funciones de plantilla de especialización parcial.

Elemento de código

Vista Diseñador de clases

class A

{

template <class T, class U>

void func(T a, U b);

template <class T>

void func(T a, int b);

};

A

func<T, U> (+ 1 sobrecarga)

template <class T1>

class A {

template <class T2>

class B {};

};

template<> template<>

class A<type>::B<type> {};

A<T1>

Clase de plantilla

B<T2>

Clase de plantilla

(B se encuentra dentro de la clase A, bajo Tipos anidados)

template <class T>

class C {};

class A : C<int> {};

A

Clase

-> C<int>

C<T>

Clase de plantilla

En la tabla siguiente se muestran algunos ejemplos de herencia de plantillas.

Elemento de código

Vista Diseñador de clases

template <class T>

class C {};

template<>

class C<int> {

class B {};

}

class A : C<int>::B {};

A

Clase

->B

C<int>

Clase

(B se encuentra dentro de la clase C, bajo Tipos anidados)

C<T>

Clase de plantilla

En la tabla siguiente se muestran algunos ejemplos de conexión de clases especializadas canónicas.

Elemento de código

Vista Diseñador de clases

template <class T>

class C {};

template<>

class C<int> {};

class A : C<int> {};

class D : C<float> {};

A

Clase

->C<int>

C<int>

Clase

C<T>

Clase de plantilla

D

Clase

->C<float>

class B {

template <class T>

T min (const T &a, const T &b);

};

B

min <T>

Vea también

Referencia

Classes, Structures, and Unions

Anonymous Class Types

Multiple Inheritance

Multiple Base Classes

Conceptos

Trabajar con código de Visual C++ (Diseñador de clases)

Otros recursos

Templates