2012-05-06 12 views
6

"una estructura tiene herencia pública por defecto" ¿qué significa realmente esta afirmación? ¿Y por qué el siguiente código está en error solo porque he omitido la palabra clave 'public' mientras obtengo la clase d de c ??"una estructura tiene herencia pública por defecto"

struct c 
{ 
protected: 
    int i; 
public: 
    c(int ii=0):i(ii){} 
    virtual c *fun(); 
}; 

c* c::fun(){ 
    cout<<"in c"; 
    return &c(); 
} 

class d : c 
{ 
public: 
    d(){} 
    d* fun() 
    { 
     i = 9; 
     cout<<"in d"<<'\t'<<i; 
     return &d(); 
    } 
}; 


int main() 
{ 
    c *cc; 
    d dd; 
    cc = &dd; 
    cc->fun(); 
} 
+0

no ignore las advertencias que el compilador le lanza. – moooeeeep

Respuesta

9

Esto significa que

struct c; 
struct d : c 

es equivalente a

struct d : public c 

Su código es un class extender una struct:

struct c; 
class d : c; 

es equivalente a

class d : private c; 

porque class tiene herencia privada por defecto.

Y significa que todos los métodos heredados y no sobrescritos/sobrecargados/ocultos de c son privados en d.

+0

el error está en la segunda última línea de 'cc = & dd' principal.Aquí simplemente estamos asignando la dirección de la clase derivada a un puntero a una clase base. ¿Qué tiene que ver la herencia pública y privada con eso? – user1232138

+0

@ user1232138 con herencia privada, la clase 'd' no es una' c'. – juanchopanza

+0

Hay un error en esta respuesta: struct c; clase d: c; es equivalente a la clase d: public c; "Las estructuras tienen herencia pública" significa que se heredan públicamente por defecto. Prueba: el siguiente código compila: struct A {int x; }; clase B: A { void foo() {x = 2; } }; –

2

Cuando escribe un struct y hereda de algo sin especificar un especificador de acceso, esa herencia se trata como public. Cuando escribe un class y hereda de algo sin especificar un especificador de acceso (incluso si ese algo es un struct), esa herencia se trata como privada. En su código, está haciendo lo último, por lo que la herencia es privada, de ahí el error observado.

Dicho de otra manera, decir que struct herencia es pública por defecto en realidad significa que la herencia hecho al escribir unstruct es pública por defecto, no es que heredar de un struct es pública por defecto.

5

"una estructura ha herencia pública por defecto" significa que este

struct Derived : Base {}; 

es equivalente a

struct Derived : public Base {}; 

clases tienen privada herencia por defecto, por lo que cuando se quita la public de una herencia de clase tiene el equivalente de

class Derived : private Base {}; 

En este escenario la herencia privada, Derived no tiene un relación es-un con Base, que esencialmente tiene -aBase. Entonces, la conversión que está tratando de intentar aquí:

cc = &dd; 

no está permitido.

Cuestiones relacionadas