2012-03-14 9 views
7

Sono nuovo del C++. Mi piace esplorare l'idea di Ereditarietà in C++. Ogni volta che provo a compilare il seguente codice ottengo l'errore:Come implementare l'ereditarietà in C++ e risolvere l'errore "la classe genitore non è accessibile come base della classe figlio"?

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 

Qui è il mio codice:

#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();  
    } 

Che cosa è veramente storto? Qual è la causa dell'errore e come evitarlo. Si prega di spiegare in dettaglio.

+4

probabilmente avrete bisogno di fare 'classe Bike: veicolo a pubblico invece di' classe Bike: veicolo a –

+1

FYI: siete tra cui C header in C++, ti manca '#include ', le classi sono scope private di default quindi 'class Class: BaseClass' è un'ereditarietà privata, ed è' int main() '... – AJG85

+0

@ AJG85 Grazie per avermi aggiornato. –

risposta

15

class ha eredità di default privato, quindi si avrebbe bisogno di specificare public, vale a dire

class Ship : public Vehicle { }: 

ans così via. struct ha ereditarietà pubblica come predefinito.

+0

Diciamo se io piace modificare il codice sopra per conoscere le parole chiave virtuali, amichevoli e protette. In quali scenari utilizziamo queste parole chiave tenendo presente l'esempio di codice sopra riportato. –

+0

@Maxood Vorrei iniziare cercando l'ereditarietà virtuale, gli specificatori di accesso (pubblico, privato, protetto), i metodi virtuali e i metodi virtuali puri. È semplicemente troppo da spiegare in un commento, ma ci sono un sacco di risorse online e persino domande di stackoverflow su tutti questi argomenti. In bocca al lupo! – juanchopanza

+0

Ancora grazie! Ripubblicherò lo stesso codice con alcune modifiche e modifiche nello scenario con una nuova domanda. –

1

è necessario specificare il livello di accesso eredità:

class Bike : public Vehicle 

Vale a dire è necessario rendere Vehicle una base public.

1

Se non si specifica un identificatore di accesso, l'ereditarietà è automaticamente private. È necessario modificare queste righe:

class Ship:Vehicle 

a questo:

class Ship:public Vehicle 
+0

"privato" significa che solo i membri privati ​​sono ereditati? –

+0

No. Significa che tutti i membri dei genitori sono privati ​​della classe base. – eduffy

+0

Vuoi dire che tutti i membri principali sono privati ​​(invisibili) alla classe figlio? –

0

incapsulamento si ottiene inserendo i dati relativi allo stesso posto e offrendo sicurezza al data.include

  1. private-access garantito alla stessa classe
  2. public-any code può accedere ai dati
  3. protected-access garantito ai metodi della stessa classe, amico di classe e classe derivata
Problemi correlati