Permisos de miembros, constructores y destructores en la herencia de C++

  1. Heredar permisos de miembro

    Las variables miembro de la clase padre y los tipos de permiso de función miembro son públicos, protegidos y privados.También
    hay tres tipos de herencia pública, protegida y privada.

    Permisos de clase padre\método de herencia público protegido privado
    público público protegido privado
    protegido protegido protegido privado
    privado inaccesible inaccesible inaccesible

    Se puede ver que aunque los miembros privados de la clase principal se heredan de la subclase, no se puede acceder a los miembros de la subclase; los permisos de los miembros públicos y protegidos de la clase principal después de la herencia son la versión estricta de los permisos y métodos de herencia de la clase padre. Por lo tanto, no se puede acceder a los miembros privados de la clase principal y las funciones miembro de la subclase. Ya sea que sean heredados o recién agregados por ellos mismos, no pueden acceder a los miembros privados de la clase principal. Solo llamando a las funciones miembro no privadas de la clase principal
    en la función miembro

    class A
    {
          
          
    public:
        A(int a_, int b_):a(a_),b(b_){
          
          }
        int geta()
        {
          
          
            return a;
        }
    
    private:
        int a;
        int b;
    };
    
    class B:protected A
    {
          
          
    public:
        B(int a_,int b_,int c_):A(a_,b_), c(c_){
          
          }
        int getaa()
        {
          
          
            return geta();
        }
    
    private:
        int c;
    };
    
    int main()
    {
          
          
        B MY{
          
          1,2,3};
        cout<<MY.getaa()<<endl;  //可以,用父类的成员函数间接访问
        cout<<MY.geta()<<endl;  //报错,无法访问
        return 0;
    }
    
  2. Constructor
    Una clase debe tener un constructor y un destructor, pero si no lo escribe, el compilador generará automáticamente un constructor y un destructor predeterminados para usted. Siempre que escriba un constructor, el compilador no generará un constructor predeterminado sin parámetros para usted, por lo que será mejor que escriba también el constructor predeterminado (múltiples constructores están sobrecargados).

    Al instanciar un objeto de subclase, el constructor de la subclase también debe llamar al constructor de la clase principal , y solo se puede llamar en la lista de inicialización , porque el constructor no se heredará a la subclase. Por lo tanto, es mejor especificar a qué constructor de la clase padre llamar en la lista de inicialización. Incluso si no se especifica , se llamará al constructor predeterminado de la clase principal. En este momento, debe asegurarse de que la clase principal tenga un constructor, de lo contrario, se informará un error.
    El orden en que se llama a los constructores es primero el constructor de la clase principal y luego el constructor de la subclase.

  3. ¿Cuándo debe el destructor
    escribir el destructor ? Cuando renueva la memoria dinámica en el constructor, debe escribir la eliminación del destructor para liberar la memoria; de lo contrario, habrá una pérdida de memoria. El orden de llamada del destructor
    en la herencia es opuesto al del constructor, que es llamar primero al destructor de la subclase y luego al destructor de la clase principal. En este momento, no es necesario especificar qué destructor de la clase principal, porque cada clase tiene solo un destructor.

Supongo que te gusta

Origin blog.csdn.net/qq_41253960/article/details/124347463
Recomendado
Clasificación