2012-03-14 10 views
7

Soy nuevo en C++. Me gusta explorar la idea de Herencia en C++. Cada vez que intento compilar el código siguiente me sale el error:¿Cómo implementar la herencia en C++ y resolver el error "no se puede acceder a la clase padre de la base de clase secundaria"?

for C++ includes, or <iostream> instead of the deprecated header <iostream.h>. To disable this warning use -Wno-deprecated. 
D:\C Practice Files\Vehicle.cpp: In function `int main()': 
D:\C Practice Files\Vehicle.cpp:26: error: `void Vehicle::setStationary_state(bool)' is inaccessible 
D:\C Practice Files\Vehicle.cpp:141: error: within this context 
D:\C Practice Files\Vehicle.cpp:141: error: `Vehicle' is not an accessible base of `Ship' 

Execution terminated 

Aquí está mi código:

#include <iostream.h> 
#include <conio.h> 
using std::string; 

class Vehicle{ 

      private:   
       bool stationary_state; 
       double max_speed; 
       double min_speed; 
       double weight; 
       double volume; 
       int expected_life; 
       string fuel_type; 
       string model; 
       string year_of_manufacture; 

      public:   
       Vehicle(){ 
       } 

       void setStationary_state(bool m){ 
         stationary_state = m;     
       } 

       bool getStationary_state(){ 
         return stationary_state;     
       }  
    }; 


    class Bike:Vehicle{ 
      private: 
       string bike_type; 

      public: 
       void setBike_Type(string t){ 
        type = t; 
       }  
       string getBike_Type(){ 
        return bike_type; 
       } 
    };  


    class Aircraft:Vehicle{ 
      private: 
      short no_of_wings; 

      public: 
      void setNo_of_wings(short wings) 
      { 

       no_of_wings = wings; 
      } 

      short getNo_of_wings() 
      { 
        return no_of_wings;  
      } 
      }; 



    class Car:Vehicle{ 

      private: 
      string reg_no; 
      string type; 

      public: 
      void setType(string t) 
      { 

       if ((t=="Pneumatic") || (t=="Hydraulic")) 
       { 
        type = t; 
       } 
       else 
       { 
        cout<<"\nInvalid entry. Please enter the correct type:"; 
        setType(t);   
       } 
      }  
      }; 




    class Ship:Vehicle{ 

      private: 
      bool has_radar_detection; 


      public: 
      void setRadar_Detection(bool r){ 

        has_radar_detection = r;           
      } 

      bool getRadar_Detection(){ 
        return has_radar_detection;         
      }  

      }; 


     int x; 
    main() 
    { 
     Vehicle v; 

     Bike b; 

     Car c; 

     Aircraft a; 

     Ship s; 

     s.setStationary_state(true); 

     c.setType("xyz"); 



     /*v.setStationary_state(true); 

     if (!(v.getStationary_state())) 
     { 
     cout<<"Vehicle is moving";       
     } 
     else 
     { 
     cout<<"Vehicle is at rest"; 
     }   
     */ 

     getch();  
    } 

Lo que es realmente mal allí? ¿Cuál es la causa del error y cómo evitarlo? Por favor explique en detalle.

+4

es probable que desee hacer 'bicicletas clase: Vehicle' público en lugar de simplemente' bicicletas clase: Vehicle' –

+1

FYI: se está incluyendo C encabezados en C++, te falta '#include ', las clases son ámbito privado predeterminado, por lo que 'clase Class: BaseClass' es herencia privada, y es' int main() '... – AJG85

+0

@ AJG85 Gracias por actualizarme. –

Respuesta

15

class tiene de herencia predeterminado privada, por lo que se debe precisar public, es decir

class Ship : public Vehicle { }: 

ans así sucesivamente. struct tiene herencia pública como valor predeterminado.

+0

Digamos que si desea modificar el código anterior para aprender sobre palabras clave virtuales, de amigo y protegidas. En qué escenarios usamos estas palabras clave, teniendo en cuenta el ejemplo de código anterior. –

+0

@Maxood Comenzaría buscando herencia virtual, especificadores de acceso (público, privado, protegido), métodos virtuales y métodos virtuales puros. Simplemente es demasiado para explicar en un comentario, pero hay muchos recursos en línea e incluso preguntas sobre todos estos temas. ¡Buena suerte! – juanchopanza

+0

¡De nuevo, gracias! Volveré a publicar el mismo código con algunos cambios y modificaciones en el escenario con una nueva pregunta. –

1

es necesario especificar el nivel de acceso de herencia:

class Bike : public Vehicle 

es decir, necesita hacer Vehicle una base public.

1

Si no especifica un especificador de acceso, la herencia es automáticamente private. Es necesario cambiar estas líneas:

class Ship:Vehicle 

a esto:

class Ship:public Vehicle 
+0

¿'Privado' significa que solo los miembros privados son heredados? –

+0

No. Significa que todos los miembros de los padres son privados de la clase base. – eduffy

+0

¿Quiere decir que todos los miembros padres son privados (invisibles) para la clase infantil? –

0

encapsulación se logra mediante la colocación de los datos relacionados en el mismo lugar y ofrecer seguridad a la data.include

  1. private-access garantizada a la misma clase
  2. public-any code pueden acceder a los datos
  3. protected-access garantizado a los métodos de la misma clase, clase amigo y clase derivada
Cuestiones relacionadas