2011-11-04 13 views
14

g++ me niega el acceso a un tipo, solo porque resulta ser un abuelo privado. ¿Esto tiene sentido?Tipo inaccesible debido a herencia privada

struct A {}; 

struct B : private A {}; 

struct C : B { 
    void foo(A const& a) {} 
}; 

compilar esta rendimientos:

1:10: error: ‘struct A A::A’ is inaccessible 
6:12: error: within this context 

Mi punto es: nunca quisieron acceder A como un antepasado. De hecho, si A es un ancestro privada de B, no debe esto sea completamente invisible a nadie más que a B (es decir C)?

Por supuesto, podría usar protected herencia, pero en mi caso no tiene mucho sentido.

Respuesta

13

Esto se debe al nombre de clase inyectado de A que oculta el A global dentro de C. Aunque A es visible, no es accesible (ya que se importa como privado), de ahí el error. Puede acceder A por mirar hacia arriba en el espacio de nombres global:

void foo(::A const& a) {} 
8

si se declara como sigue funciona

struct A {}; 

struct B : private A {}; 

struct C : B { 
    void foo(::A const& a) {} 
}; 

El error que su visión es hacer que no la resolución de nombres de acceso. The :: A dice: mira el espacio de nombres global no mis tipos de clases anidados heredados. También recuerde que la herencia privada solo dice que B tiene una A y que IMOHO es una característica estúpida del lenguaje que debe evitarse.

+1

No es una característica estúpida en absoluto; le permite a uno restringir la interfaz heredada seleccionando individualmente las funciones para exponer con 'using'. – avakar

+2

Lo que podría hacer con las funciones del reenviador sin la función y hacer que el modelo de herencia C++ sea menos abarrotado. la herencia privada no es herencia, su composición y usar la misma semántica para lograr dos conceptos separados es solo confusa. – rerun

+2

Es una diferencia entre la composición y la herencia privada, porque esta última le permite acceder a miembros protegidos de su padre, mientras que la primera no. – bitmask

Cuestiones relacionadas