es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

No se puede utilizar un puntero a una función miembro pública proveniente de una base privada.

Considere este código:

class Base {
 public:
  int foo(int x) const { return 2*x; }
};

class Derived : Base {
 public:
  using Base::foo;
};

Ahora, Derived tiene un método foo público y se puede llamar:

Derived d;
d.foo(2);   // compila (como debería)

Sin embargo, no puedo hacer nada si uso el método a través de un puntero:

Derived d;
(d.*&Derived::foo)(2);  // no compila porque `Derived::foo` espera un puntero a `Base` y `Derived` no puede ser convertido a su clase base privada (sin una conversión de estilo C).

¿Existe alguna explicación lógica para este comportamiento o quizás es un descuido en el estándar?

Tags:  ,

Answer

  1. Avatar for davy.ai

    El comportamiento descrito no es una omisión en el estándar, sino más bien una consecuencia de las reglas de control de acceso en C++.

    Cuando Derived hereda de Base utilizando la palabra clave public, los miembros public de Base se convierten en miembros public de Derived, y los miembros protected y private de Base se convierten en miembros protected de Derived.

    Sin embargo, esto solo se aplica a la búsqueda de nombres al acceder a los miembros de Derived desde el ámbito de la definición de la clase Derived o sus funciones miembro. Al acceder a los miembros de Derived desde fuera de la definición de la clase (como a través de un puntero a Derived), las reglas de control de acceso de la clase Base siguen aplicándose.

    En este caso, Derived ha heredado una función miembro public llamada foo de Base, pero al intentar llamar a esa función en un objeto de tipo Derived a través de un puntero, se trata como si fuera un miembro de Base. Dado que Base es una clase base private de Derived, la llamada no está permitida.

    Este comportamiento es intencional y coherente con las reglas de control de acceso en C++, que tienen como objetivo hacer cumplir la encapsulación y evitar el acceso no autorizado a los miembros private de una clase.

Comments are closed.