P36-Capítulo 14 Resumen de la reutilización de código en C ++

Directorio de artículos

1. Resumen

C ++ proporciona varias formas de reutilizar código.

La herencia pública presentada en el Capítulo 13 puede establecer una relación es-a para que las clases derivadas puedan reutilizar
el código de la clase base .

La herencia privada y la herencia protegida también permiten reutilizar el código de la clase base, pero establecen una relación has-a.
Cuando se usa la herencia privada, los miembros públicos y los miembros protegidos de la clase base se convertirán en miembros privados de la clase derivada;
cuando se usa la herencia protegida, los miembros públicos y los miembros protegidos de la clase base se convertirán en los miembros protegidos de la clase derivada. Independientemente del tipo de herencia que se utilice, la interfaz pública de la clase base se convertirá en la interfaz interna de la clase derivada. Esto a veces se denomina implementación heredada, pero no hereda la interfaz, porque el objeto de la clase derivada no puede utilizar explícitamente la interfaz de la clase base. Por tanto, el objeto derivado no puede considerarse como una especie de objeto base. Por esta razón, sin una conversión de tipo explícita, los punteros o referencias de clase base no podrán apuntar a objetos de clase derivada.

También puede reutilizar el código de la clase desarrollando clases que contengan miembros de objeto. Este método se llama inclusión, jerarquía o combinación, y también establece una relación tiene-a. En comparación con la herencia privada y la herencia protegida, la inclusión es más fácil de implementar y usar, por lo que generalmente se prefiere este método.
Sin embargo, la herencia privada y la herencia protegida tienen algunas funciones diferentes. Por ejemplo, la herencia permite que las clases derivadas accedan a los miembros protegidos de la clase base; también permite que las clases derivadas redefinan las funciones virtuales heredadas de la clase base.

Debido a que la inclusión no es herencia, estas funciones no se pueden usar cuando se reutiliza el código de la clase a través de la inclusión. Por otro lado, si necesita usar varios objetos de una determinada clase, usar contiene es más adecuado. Por ejemplo, la clase State puede contener un conjunto de objetos County.

La herencia múltiple (MI) hace posible reutilizar el código de múltiples clases en el diseño de clases. El MI privado o MI protegido establece una relación has-a, mientras que el MI público establece una relación is-a. MI traerá algunos problemas, es decir, definir el mismo nombre varias veces y heredar varios objetos de clase base. Puede usar calificadores de clase para resolver el problema de la ambigüedad de nombres y usar clases base virtuales para evitar el problema de heredar múltiples objetos de clase base.

Pero después de usar la clase base virtual, es necesario introducir nuevas reglas para escribir la lista de inicialización del constructor y resolver el problema de ambigüedad.
Las plantillas de clases permiten la creación de diseños de clases genéricos, donde los tipos (generalmente tipos de miembros) se representan mediante parámetros de tipo. La plantilla típica es la siguiente:

template <class T>
class Ic
{
    
    
	T v;
public:
	Ic(const T &val) : v(val) {
    
    }	
};

Entre ellos, T es un parámetro de tipo, que se utiliza como marcador de posición para el tipo real que se especificará más adelante (este parámetro puede ser cualquier nombre C ++ válido, pero normalmente se utilizan T y Type). En este entorno, también puede usar typename en lugar de class

template <typename T> // same as template <class T>
class Rev {
    
    };

La definición de clase (creación de instancias) se genera cuando se declara un objeto de clase y se especifica un tipo específico. Por ejemplo, la siguiente declaración hace que el compilador genere una declaración de clase para reemplazar todos los parámetros de tipo T en la plantilla con el tipo real corto en la declaración:

class Ic<short> sic; //implicit instantiation

Aquí, el nombre de la clase es Ic <short>, no lc. lc<shor>A esto se le llama reificación de plantilla. Específicamente, esta es una instanciación implícita.

Cuando se utiliza la plantilla de palabras clave para declarar una reificación específica de una clase, se producirá una instanciación explícita

template class IC<int>: //explicit instantiation

En este caso, el compilador utilizará la plantilla genérica para generar una int reificación lc<int>, aunque todavía no se ha solicitado un objeto de esta clase.

Puede proporcionar una reificación explícita, una declaración de clase concreta que anula la definición de la plantilla. El método se basa en template<>inicios, luego en el nombre de la clase de plantilla más los corchetes angulares (que contiene lo específico del tipo). Por ejemplo, el código para proporcionar una clase lc dedicada para punteros de caracteres es el siguiente:

template <> class Ic<char *>
{
    
    
	char *str;
public:
	Ic(const char * s) : str(s) {
    
    }
};

De esta manera, una declaración como la siguiente usará una definición dedicada para chic en lugar de una plantilla genérica:

class Ic<char *> chic;

Una plantilla de clase puede especificar varios genéricos y también puede tener parámetros que no sean de tipo:

template <class T, class TT, int n>
class Pals {
    
    };

La siguiente declaración generará una instanciación implícita con double en lugar de T, string en lugar de TT y 6 en lugar de n:

Pals<double, string, 6> mix;

Las plantillas de clase también pueden contener parámetros que son plantillas en sí mismas:

template < template <typename T> class CL, typename U, int z>
class Trophy {
    
    };

Donde z es un valor int, U es el nombre del tipo y CL es una plantilla de clase declarada usando template <typename, T>

Las plantillas de clase se pueden cosificar parcialmente:

template <class T> Pals<T, T, 10> {
    
    };
template <class T, class TT> Pals<T, TT, 100> {
    
    };
template <class T, int n> Pals <T, T*, n> {
    
    };

La primera declaración crea una cosificación cuando los dos tipos son iguales y el valor de n es 10.
De manera similar, la segunda declaración crea una cosificación para el caso donde n es igual a 100; la
tercera declaración crea una cosificación para el caso donde el segundo tipo es un puntero al primer tipo.

Las clases de plantilla se pueden utilizar como miembros de otras clases, estructuras y plantillas.

El propósito de todos estos mecanismos es permitir a los programadores reutilizar el código probado sin copiarlo manualmente. Esto simplifica la programación y proporciona confiabilidad al programa.

Supongo que te gusta

Origin blog.csdn.net/sgy1993/article/details/114076399
Recomendado
Clasificación